一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
七、补充一些 相关的Git 知识
1 head 的理解
HEAD 指向当前所在的分支,类似一个活动的指针,表示一个「引用」。
HEAD 既可以指向「当前分支」的最新 commit,也可以指向历史中的某一次 commit (「分离头指针」的情况)。归根结底,HEAD 指向的就是某个提交点。
当我们做分支切换时,HEAD 会跟着切换到对应分支。
2. fast-forward 与 —no-ff 的区别
假如有一个场景:有两个分支,master 分支和 feature 分支。现在,feautre 分支需要合并回 master 分支。
fast-forward 合并方式是条件允许的情况,通过将 master 分支的 HEAD 位置移动到 feature 分支的最新提交点上,这样就实现了快速合并。这种情况,是不会新生成 commit 的。(快进模式)
git checkout master # 先切换到master分支
git merge feature # 将feature分支合并到当前分支上(master)
-
--no-ff 的方式进行合并,master 分支就会新生成一次提交记录。
git checkout master # 先切换到master分支
git merge --no-ff feature # 将feature分支合并到当前分支上(master)
如果条件满足时,merge 默认采用的 fast-forward 方式进行合并,除非你显示的加上 --no-ff 选项;而条件不满足时,merge 也是无法使用 fast-forward 合并成功的!
3. merge操作
git merge 操作是区分上下文的。当前分支始终是目标分支,其他一个或多个分支始终合并到当前分支。这个注意点记住了,方便记忆!所以,当需要将某个分支合并到目标分支时,需要先切到目标分支上。
条件满足的含义
快进模式能够进行的条件是:**源分支和目标分支之间没有分叉。**下图则是无法通过 HEAD 的快速移动实现分支的合并。
如果执行合并操作,默认会尝试 fast-forward 的方式进行合并,但是因为分叉了,所以此时会采用 no-ff 的方式进行合并,有新的 commit 生成了。最终的结果图如下:
git checkout master # 先切换到目标分支
git merge feature
4.rebase操作
rebase 合并往往又被称为 「变基」。这里的「基」就是一个「基点」、「起点」的意思。git rebase 命令通常称为向前移植(forward porting)。
「变基」就是改变当前分支的起点。注意,是当前分支! rebase 命令后面紧接着的就是「基分支」。与merge操作相反。
变基前:
执行命令:
git checkout feature # 切换到当前分支,或待变基分支
git rebase master # 变基
# 可合并为下面的语句
git rebase master feature
变基后:
解释:rebase,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了E而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)
推荐使用场景
往公共分支上合代码的时候,推荐使用merge。
拉公共分支最新代码的时候,推荐使用rebase,也就是git pull -r或git pull --rebase,但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛。
图示
从Develop分支分出两个分支,分属两个人员进行开发。F1分支开发完毕后,push到总分支。F2分支开发到F2_5时需要拉取最新代码。
如果F2分支采用git pull拉取最新代码:
F1分支的视角(F1分支的commit记录):
F2分支的视角:这将会把F1分支的修改直接拉下来于本地代码merge,且产生一个commit F2_5,也就是merge commit。
如果F2分支采用git pull --rebase 拉取最新代码:
F1分支视角不变 F2分支视角:
5.强制拉取到本地仓库
有些时候本地仓库提交管理混乱,需要从远程仓库强制拉取,以刷新本地仓库,覆盖所有add和commit操作。可执行以下代码:
git fetch --all
git reset --hard origin/master
git pull
6.远程分支合并
该项职责由git管理员来完成。例如当开发分支Develop上的所有功能已经完成时,需要合并到master上时:
代码clone到本地仓库:
git clone
在本地创建dev分支并与远程dev分支对应:
git checkout -b dev origin/dev
切换到master分支
git checkout master
本地的dev合并到master上(遇到冲突解决完后再次提交)
git merge dev
推送到远程的master上(执行这项操作时,需要有操作远程master分支的权限)
git push origin master
释放权限: