春招准备之Git篇
本系列内容直接以八股文,即问题的形式总结,面试所需内容
1、什么是Git?
Git 是一个开源的分布式版本控制系统(DVCS),可以跟踪文件的更改,允许恢复到任何特定的版本,由于其分布式架构,一个主要的优点就是不依赖中央服务器来存储项目文件的所有版本。
因此当服务器中断时,你需要的所有恢复数据都在队友的Git存储库中,中央云存储库开发人员可以向其提交更改,并与其他团队成员进行共享
2、Git和SVN的区别?
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等
Git 与SVN的区别点:
1、Git 是分布式的,SVN 不是(集中版本控制系统):这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
3、Git的工作流程?
1、克隆仓库
如果你要参与一个已有的项目,首先需要将远程仓库克隆到本地:
git clone https://github.com/username/repo.git
cd repo
2、创建新分支
为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支:
git checkout -b new-feature
3、工作目录
在工作目录中进行代码编辑、添加新文件或删除不需要的文件。
4、暂存文件
将修改过的文件添加到暂存区,以便进行下一步的提交操作:
git add filename
git add . # 或者添加所有修改的文件
5、提交更改
将暂存区的更改提交到本地仓库,并添加提交信息:
git commit -m "Add new feature"
git commit -a "Add new feature"
-a:通过命令行上加-a,指示提交已修改的所有被跟踪文件的新内容
注:
在 Linux 系统中,commit 信息使用单引号 ',Windows 系统,commit 信息使用双引号 "。
所以在 git bash 中 git commit -m '提交说明' 这样是可以的,在 Windows 命令行中就要使用双引号 git commit -m "提交说明"。
6、拉取最新更改
在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突:
git pull origin main
git pull origin new-feature # 或者如果在新的分支上工作
7、推送更改
将本地的提交推送到远程仓库:
git push origin new-feature
8、创建 Pull Request(PR)
在 GitHub 或其他托管平台上创建 Pull Request,邀请团队成员进行代码审查。PR 合并后,你的更改就会合并到主分支。
9、合并更改
在 PR 审核通过并合并后,可以将远程仓库的主分支合并到本地分支:
git checkout main
git pull origin main
git merge new-feature
10、删除分支
如果不再需要新功能分支,可以将其删除:git branch -d new-feature
从远程仓库删除分支:git push origin --delete new-feature
4、Git如何创建仓库?
分两种情况:一是创建一个空白的仓库,另一个是使用已经存在的仓库
Git 使用 git init 命令来初始化一个 Git 仓库,执行完命令后,Git 仓库会生成一个 .git 目录,Git的命令很多要在Git的仓库中运行,所以 git init 是使用 Git 的第一个命令。
使用方法
1、进入你想要创建仓库的目录,或者先创建一个新的目录:
mkdir my-project
cd my-project
使用当前目录作为 Git 仓库,我们只需使它初始化,该命令执行完后会在当前目录生成一个 .git 目录
git init
2、使用我们指定目录作为Git仓库
git init newrepo
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
简单记忆:git init (git仓库地址)
5、Git如何克隆仓库?
我们使用 git clone 从现有 Git 仓库中拷贝项目
git clone <repo>
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone <repo> <directory>
- repo:Git 仓库。
- directory:本地目录
6、Git怎么配置文件?
git 的设置使用 git config 命令
1、全局(整台机器所有仓库) ~/.gitconfig
git config --system user.name "Your Name"
git config --system user.email "you@example.com"
2 、当前用户(登录账号) ~/.gitconfig
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
3 、仅当前仓库 .git/config
git config user.name "Your Name"
git config user.email "you@example.com"
去掉global只对当前仓库有效
4、查看已生效的所有配置
git config --list
7、Git的工作区、暂存区和版本库?
基本概念:
工作区(Working Directory)
工作区是你在本地计算机上的项目目录,你在这里进行文件的创建、修改和删除操作。工作区包含了当前项目的所有文件和子目录。
特点:
- 显示项目的当前状态。
- 文件的修改在工作区中进行,但这些修改还没有被记录到版本控制中。
暂存区(Staging Area)
暂存区是一个临时存储区域,它包含了即将被提交到版本库中的文件快照,在提交之前,你可以选择性地将工作区中的修改添加到暂存区。
特点:
- 暂存区保存了将被包括在下一个提交中的更改。
- 你可以多次使用
git add
命令来将文件添加到暂存区,直到你准备好提交所有更改。
版本库(Repository)
版本库包含项目的所有版本历史记录。
每次提交都会在版本库中创建一个新的快照,这些快照是不可变的,确保了项目的完整历史记录。
特点:
- 版本库分为本地版本库和远程版本库。这里主要指本地版本库。
- 本地版本库存储在
.git
目录中,它包含了所有提交的对象和引用。
工作区、暂存区和版本库之间的关系?
1、工作区 -> 暂存区
使用 git add 命令将工作区中的修改添加到暂存区。
git add filename
2、暂存区 -> 版本库
使用 git commit 命令将暂存区中的修改提交到版本库。
git commit -m "Commit message"
3、版本库 -> 远程仓库
使用 git push 命令将本地版本库的提交推送到远程仓库。
git push origin branch-name
4、远程仓库 -> 本地版本库
使用 git pull 或 git fetch 命令从远程仓库获取更新。
git pull origin branch-name
# 或者
git fetch origin branch-name
git merge origin branch-name
8、如何还原已经 push 并公开的提交?
创建一个新的提交,撤消在错误提交中所做的所有更改,可以使用命令:
git revert <name of bad commmit>
9、git pull 和 git fetch 有什么区别?
git pull 下载并自动合并远程更新到当前分支(相当于git fetch +
git merge)
git fetch 只下载远程更新,不合并到本地分支
想先查看远程更新再决定是否合并 → 用git fetch
信任远程更新,直接同步 → 用 git pull
10、Git 分支管理?
Git 分支管理是 Git 强大功能之一,能够让多个开发人员并行工作,开发新功能、修复 bug 或进行实验,而不会影响主代码库
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线
分支管理命令:
1、创建分支
创建新分支并切换到该分支:
git checkout -b <branchname>
切换分支命令:
git checkout <branchname>
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录
2、查看分支
查看本地的所有分支:
git branch
查看远程分支:
git branch -r
查看所有本地和远程分支:(远程分支会以 remotes/
前缀列出)
git branch -a
3、合并分支
将其他分支合并到当前分支:
git merge <branchname>
例如:
git checkout main
git merge feature-xyz
4、删除分支
删除本地分支:
git branch -d <branchname>
强制删除未合并的分支:
git branch -D <branchname>
删除远程分支:
git push origin --delete <branchname>
11、Git Stash?
临时保存工作进度:允许临时保存当前工作目录的更改,以便可以切换到其他分支或处理其他任务
通常情况下,当你一直在处理项目的某一部分时,如果你想要在某个时候切换分支去处理其他事 情,事情会处于混乱的状态。问题是,你不想把完成了一半的工作的提交,以便你以后就可以回到 当前的工作。解决这个问题的答案是 git stash
保存当前工作进度:
git stash
查看存储的进度:
git stash list
清空所有存储:
git stash clear
删除特定的存储项目?
git stash drop 命令用于删除隐藏的项目。默认情况下,它将删除最后添加的存储项,如果提供 参数的话,它还可以删除特定项
如果要删除名为 stash@{0} 的项目,请使用命令 git stash drop stash@{0}
一般什么情况下会使用git stash
命令git stash是把工作区修改的内容存储在栈区
以下几种情况会使用到它:
1、解决冲突文件时,会先执行git stash,然后解决冲突;
2、遇到紧急开发任务但目前任务不能提交时,会先执行git stash,然后进行紧急任务的开发,然 后通过git stash pop取出栈区的内容继续开发;
3、切换分支时,当前工作空间内容不能提交时,会先执行git stash再进行分支切换;
12、Git Rebase?
Git Rebase 是一个强大的工具,用于将一个分支的更改“移动”到另一个分支的最新提交之上,从而创建一个线性、干净的提交历史。它常用于整理提交记录、避免不必要的合并提交(merge commit),但也会重写提交历史,因此需要谨慎使用
Rebase 的意思是“变基”,即将当前分支的提交“摘下来”,然后重新应用到目标分支的最新提交之上
变基当前分支到指定分支:
git rebase <branchname>
将当前分支变基到 main
分支:
git rebase main
交互式变基:
git rebase -i <commit>
交互式变基允许你在变基过程中编辑、删除或合并提交
git merge和git rebase之间的区别?
简单的说,git merge和git rebase都是合并分支的命令。
git merge branch会把branch分支的差异 内容pull到本地,然后与本地分支的内容一并形成一个committer对象提交到主分支上,合并后的分支与主分支一致;
git rebase branch会把branch分支优先合并到主分支,然后把本地分支的commit放到主分支后面,合并后的分支就好像从合并后主分支又拉了一个分支一样,本地分支本身 不会保留提交历史
13、Git Cherry-Pick?
git cherry-pick命令允许你选择特定的提交并将其应用到当前分支。它在需要从一个分支移植特定更改到另一个分支时非常有用。
拣选提交:
git cherry-pick <commit>
例如,将 abc123
提交应用到当前分支:
git cherry-pick abc123
处理拣选冲突:如果拣选过程中出现冲突,解决冲突后使用git cherry-pick --continue 继续拣选
拣选feature分支上的特定提交到main分支:
git checkout main
git cherry-pick abc123
14、提交对象包含什么?
Commit 对象包含以下组件,你应该提到以下这三点:
- 一组文件,表示给定时间点的项目状态
- 引用父提交对象
- SHAI 名称,一个40个字符的字符串,提交对象的唯一标识
15、描述一下你所使用的分支策略?
(你在以前的工作中如何使用分支以及它的用途 是什么)
功能分支(Feature branching)要素分支模型将特定要素的所有更改保留在分支内。当通过自动化测试对功能进行全面测试和验证时,该分支将合并到主服务器中。
任务分支(Task branching) 在此模型中,每个任务都在其自己的分支上实现,任务键包含在分支名称中。很容易看出哪个代码实现了哪个任务,只需在分支名称中查找任务键。
发布分支(Release branching) 一旦开发分支获得了足够的发布功能,你就可以克隆该分支来形成发布分支。创建该分支将会 启动下一个发布周期,所以在此之后不能再添加任何新功能,只有错误修复,文档生成和其他 面向发布的任务应该包含在此分支中。一旦准备好发布,该版本将合并到主服务器并标记版本号。此外,它还应该再将自发布以来已经取得的进展合并回开发分支。
16、如果分支是否已合并为master,你可以通过什么手段知道?
git branch –merged 它列出了已合并到当前分支的分支。
git branch –no-merged 它列出了尚未合并的分支
17、如果本次提交误操作,如何撤销?
如果想撤销提交到索引区的文件,可以通过git reset HEAD file;
如果想撤销提交到本地仓库的文 件,可以通过git reset –soft HEAD^n 恢复当前分支的版本库至上一次提交的状态,索引区和工作 空间不变更;
可以通过git reset –mixed HEAD^n 恢复当前分支的版本库和索引区至上一次提交的
18、如何查看分支提交的历史记录?查看某个文件的历史记录 呢?
查看分支的提交历史记录:
命令git log –number:表示查看当前分支前number个详细的提交历史记录;
命令git log –number –pretty=oneline:在上个命令的基础上进行简化,只显示sha-1码和提交 信息;
命令git reflog –number: 表示查看所有分支前number个简化的提交历史记录;
命令git reflog –number –pretty=oneline:显示简化的信息历史信息;
如果要查看某文件的提交历史记录,直接在上面命令后面加上文件名即可
注意:如果没有number则显示全部提交次数
19、什么是SubGit?
SubGit 是将 SVN 到 Git迁移的工具。它创建了一个可写的本地或远程 Subversion 存储库的 Git 镜 像,并且只要你愿意,可以随意使用 Subversion 和 Git。
这样做有很多优点,比如你可以从 Subversion 快速一次性导入到 Git 或者在 Atlassian Bitbucket Server 中使用SubGit。我们可以用 SubGit 创建现有 Subversion 存储库的双向 Git-SVN 镜像。你 可以在方便时 push 到 Git 或提交 Subversion。同步由 SubGit 完成