Merge与Rebase的区别
Merge与Rebase的区别
git rebase与git merge两个命令的共同点都是解决同样的问题,即都是为了整合两个分支的改动。
在工作中通常会遇到master分支更新了,而自己的分支还是基于旧的master分支。就好像下面这幅图:
Merge
将master合并(Merge)进分支中,从而使分支获得最新的master代码。
git merge brach master
Merge的做法就好像下图一样:
相比第一幅,可以看到,Merge会在branch产生新的commit。Merge有一个好处就是:Merge是无损操作,不会改变brach的历史信息。而历史信息不改变,就相当于更容易恢复某一时刻的代码。还有一点,merge把所有的解决冲突,都保存进了一个merge commit里了。
但是Merge也有一个缺点,就是每次Merge都会产生Merge commit。如果master更新非常频繁的话,这样会污染你的历史信息。但是这种污染可以通过合并commit的方法来缓解,但是还是挺麻烦的。
Rebase
Rebase从字面上就可以理解为,改变分支的起始点。如下图:
相比第一幅图,可以看到分支的起始点变为最新master了。相当于把整个分支向前移动了。
git rebase与Merge不同,会重写整个分支的commit信息。这样的好处是:历史信息变得更加清晰了。正如上图所示,用rebase使得整个项目的历史信息变成一条直线。但是同样会带来一个问题,那就是可追朔性变差了。
交互式Rebase
交互式Rebase(Interactive Rebasing)针对Rebase可追朔性差的问题。
git rebase -i master
这句命令会列出将要移动的commit信息。例如下面:
pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
可以上面的信息,修改pick命令,或者调整顺序。举个例子:9480b3d 这个commit只是基于33d5b7a 一个很小的改动,那么就可以用fixup把他的commit信息压缩进33d5b7a 里。
pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3
当你保存退出这个列表的时候,Git会根据这些指令进行rebase,rebase的结果如下图:
使用Rebase的黄金准则
不要把master rebase进分支里 如果这么做的话,会出现像下面的情况:
因为这么做并不会改变master任何代码,别人使用的仍然是原始的master。
PS:强推
如果rebase后的分支要推到远端,会由于跟远端commit历史信息产生冲突,而无法推成功。这时候就要用强推git push -f
参考资料:
任何组织或个人未经作者授权许可,均不得以任何方式或理由全文转载以及全文复制;
也不得修改、改编、盗链或制作镜像等。
我的简书:Merge与Rebase的区别