发过程中一般对git merge
命令用的比较多,这里特意记录下git rebase
的使用。
git rebase
即变基,用于分支合并。它与git merge的区别是:
- git merge 对两个分叉的分支合并后,会产生一次新的提交,并且多个分支的历史记录都会得到保存
- git rebase 对两个分叉的分支合并后,历史记录是一条直线,会显得更为整洁
实战
前置条件: 如图所示, 当前从master分支拉出了dev和test分支,并且分别有了两次提交。
此时,如果把dev分支merge 到 test 分支, 如果采用 git merge 方式,执行如下命令即可:
#切换到test分支
git checkout test
# 将dev分支合并到test
git merge dev
如果采用git rebase方式,应该进行如下操作:
git checkout test
git rebase dev
其基本流程如下:
- 找到 test 分支和 dev分支的共同祖先C0
- 将C3, C4 的提交以补丁的形式保存起来
- 将当前的test分支指向目标基底C2
- 将C3,C4的补丁依次重放(可能会产生冲突),之后test会指向C4’
执行完4后,对应如下图所示:
5. 将dev和test以fast-forward方式合并
合并完成后,虚线框的提交记录已经没用了,可以执行git gc
命令将其回收掉。
合并的最终结果如下图所示:
到此变基操作就全部完成。
另外,在执行变基的过程中,涉及到三个命令会常用到:
git rebase --skip
它表示丢弃当前补丁的重放,即忽略掉当前补丁git rebase --abort
它表示终止正在进行的变基操作,并且恢复到最初始的状态git rebase --continue
它表示继续补丁的重放,一般在解决冲突后执行该命令
总结
- 不要对master分支进行rebase
- 一般来说,执行rebase的分支都是本地分支,没有推送到远程仓库
- 无论变基或三方合并,最终的合并结果是一样的,只不过提交历史不同罢了