欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Merge与Rebase的区别

程序员文章站 2022-06-02 13:50:55
...

Merge与Rebase的区别

git rebase与git merge两个命令的共同点都是解决同样的问题,即都是为了整合两个分支的改动。

在工作中通常会遇到master分支更新了,而自己的分支还是基于旧的master分支。就好像下面这幅图:
Merge与Rebase的区别

Merge

将master合并(Merge)进分支中,从而使分支获得最新的master代码。

git merge brach master

Merge的做法就好像下图一样:
Merge与Rebase的区别
相比第一幅,可以看到,Merge会在branch产生新的commit。Merge有一个好处就是:Merge是无损操作,不会改变brach的历史信息。而历史信息不改变,就相当于更容易恢复某一时刻的代码。还有一点,merge把所有的解决冲突,都保存进了一个merge commit里了。

但是Merge也有一个缺点,就是每次Merge都会产生Merge commit。如果master更新非常频繁的话,这样会污染你的历史信息。但是这种污染可以通过合并commit的方法来缓解,但是还是挺麻烦的。

Rebase

Rebase从字面上就可以理解为,改变分支的起始点。如下图:
Merge与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的结果如下图:

Merge与Rebase的区别

使用Rebase的黄金准则

不要把master rebase进分支里 如果这么做的话,会出现像下面的情况:
Merge与Rebase的区别
因为这么做并不会改变master任何代码,别人使用的仍然是原始的master。

PS:强推

如果rebase后的分支要推到远端,会由于跟远端commit历史信息产生冲突,而无法推成功。这时候就要用强推git push -f

参考资料:


任何组织或个人未经作者授权许可,均不得以任何方式或理由全文转载以及全文复制;
也不得修改、改编、盗链或制作镜像等。

我的简书:Merge与Rebase的区别

相关标签: git merge rebase