一、描述
在使用 git 进行版本管理的项目中,在feature分支开发完成,要将其合并到master分支时,我们有两种方式,一种是 git merge 另一种是 git rebase ,通常,我们对git merge 比较熟悉,而对git rebase 使用较少。其实,git rebase 也是极其强大的一种合并方法,下面我们就讨论下merge 和 rebase 的差别已经使用场景。
如下图,你在feature分支上进行开发,于此同时你在master也有新的提交。
为了将master分支合并feature到上,有两种选择,merge 和 rebase。
二、git merge
最简单的方法是使用以下方法将master合并到feature:
git checkout feature git merge master
或者执行:
git merge feature master
那么在feature上会自动产生一个提交记录(merge commit)
merge 合并之后的结果:
merge合并的优点:
- 自动创建一个新的commit,记录了真实的commit情况,方便查看记录
- 如果合并遇到冲突,仅需要修改后重新commit即可
merge的缺点:就是每次合并都会产生一个新的commit, 所以在使用一些git的 GUI工具,特别是commit比较频繁时,就会看到分支线很杂乱。这时如果有问题需要查找就会很困难。
三、git rebase
与git merge功能一致,rebase的目的也是将一个分支的更改合并到另一个分支中去。
rebase 在很多中文翻译中,会翻译为 “变基” 。
执行以下命令:
git checkout feature git rebase master
如上图所示,rebase的特点:
- 改变当前分支从master上拉出分支
- 没有多余的合并历史记录,并且合并后的commit顺序不一定按照commit的提交时间排序
- 可能会多次解决同一个地方的冲突
- 提交记录更干净,master上每个commit点都是相对独立完整的功能点
假如我们在rebase的过程中遇到了冲突,我们在解决冲突之后,需要执行:
1. git add
2. git rebase --continue 来继续变基的操作。
3. 如果执行第二步无效,那么可以执行 git rebase --skip
注意:不要执行完 git add 之后执行 git commit
可以看出,feature 分支上的所有提交信息都会被合并到 master 分支上了,这些信息对我们来说不是必要的,我们在 masetr 分支上往往只需要知道合并进来了什么新的功能即可,这些多余的信息可以通过 git rebase 的交互模式进行整合
四、git rebase 交互模式
打开变基的交互模式只需要传入一个参数 -i 即可,同时指定对哪些提交进行处理,例如:
git rebase -i HEAD~4
以上命令指定了对当前分支的最近四次提交进行操作,下面可以使用上面的命令对 feature 分支的提交进行合并:
处理完之后可以使用下面的命令进行提交
五、总结
当需要保留详细的合并信息的时候建议使用git merge,特别是需要将分支合并进入master分支时;当发现自己修改某个功能时,频繁进行了git commit提交时,发现其实过多的提交信息没有必要时,可以尝试git rebase。
参考:
https://www.atlassian.com/git/tutorials/merging-vs-rebasing
https://www.liaoxuefeng.com/wiki/896043488029600/1216289527823648