知乎问答:在开发过程中使用git rebase还是git merge,优缺点分别是什么?


链接:https://www.zhihu.com/question/36509119/answer/67828312

两个使用场景是不一样的,merge只是合并另外一个分支的内容,rebase也合并另外一个分支的内容,但是会把本分支的commits顶到最顶端

假设我们现在有3个分支
  1. master分支:线上环境使用的分支
  2. testing分支:测试环境使用的分支
  3. my_feature分支:开发新功能的分支,也就是当前分支

A. 假设我在my_feature上开发了一段时间,之后另外的同事开发的功能正式上线到master分支了,那么我可以在当前的分支下rebase一下master分支,这样我这个分支的几个commits相对于master还是处于最顶端的,也就是说rebase主要用来跟上游同步,同时把自己的修改顶到最上面

B. 我在my_feature上开发了一段时间了,想要放到testing分支上,那就切到testing,然后merge my_feature进来,因为是个测试分支,commits的顺序无所谓,也就没必要用rebase (当然你也可以用rebase)


另外,单独使用rebase,还有调整当前分支上commits的功能(合并,丢弃,修改commites msg)

PS:
其他知友的答案都说到冲突的问题,

1. 用merge确实只需要解决一遍冲突,比较简单粗暴
2. 用rebase有时候会需要多次fix冲突(原因在于本地分支已经提交了非常多的commit,而且很久都没有和上游合并过)

我个人推荐大家开发的时候, 尽量及时rebase上游分支(我习惯是每周merge一次),有冲突提前就fix掉,即使我们自己的分支开发了很久(哪怕是几个月),也不会积累太多的conflict,最后合并进主分支的时候特别轻松, 非常反对从master check出新分支,自己闷头开发几个月,结果最后merge进主分支的时候,一大堆冲突,自己还嗷嗷叫的行为


链接:https://www.zhihu.com/question/36509119/answer/131513261


搞清楚这个问题首先要搞清楚merge和rebase背后的含义。

先看merge,官方文档给的说明是:

git-merge - Join two or more development histories together



顾名思义,当你想要两个分支交汇的时候应该使用merge。
根据官方文档给的例子,是master merge topic,如图:
                     A---B---C topic
                    /         \
               D---E---F---G---H master

然而在实践中,在H这个commit上的merge经常会出现merge conflict。为了避免解决冲突的时候引入一些不必要的问题,工程中一般都会规定no conflict merge。比如你在github上发pull request,如果有conflict就会禁止merge。


所以才会有题主问的问题:在当前的topic分支,想要引入master分支的F、G commit上的内容以避免merge conflict,方便最终合并到master。


这种情况下用merge当然是一个选项。用merge代表了topic分支与master分支交汇,并解决了所有合并冲突。然而merge的缺点是引入了一次不必要的history join。如图:

                     A--B--C-X topic
                    /       / \
               D---E---F---G---H master

其实仔细想一下就会发现,引入master分支的F、G commit这个问题上,我们并没有要求两个分支必须进行交汇(join),我们只是想避免最终的merge conflict而已。


rebase是另一个选项。rebase的含义是改变当前分支branch out的位置。这个时候进行rebase其实意味着,将topic分支branch out的位置从E改为G,如图:

                             A---B---C topic
                            /         
               D---E---F---G master

在这个过程中会解决引入F、G导致的冲突,同时没有多余的history join。但是rebase的缺点是,改变了当前分支branch out的节点。如果这个信息对你很重要的话,那么rebase应该不是你想要的。rebase过程中也会有多次解决同一个地方的冲突的问题,不过可以用squash之类的选项解决。个人并不认为这个是rebase的主要问题。



综上,其实选用merge还是rebase取决于你到底是以什么意图来避免merge conflict。实践上个人还是偏爱rebase。一个是因为branch out节点不能改变的情况实在太少。另外就是频繁从master merge导致的冗余的history join会提高所有人的认知成本。

你可能感兴趣的:(知乎问答:在开发过程中使用git rebase还是git merge,优缺点分别是什么?)