关于git rebase,git merge,git merge --no-ff的区别

最近在使用git的时候遇到了git merge和git rebase的区别,一开始弄不太懂,于是就上网查了一下相关的资料,然后自己用github实测了一下。现在总结了一下结论分享给大家。

  一、merge和rebase

    首先说一下,merge和mege -no-ff实现的功能是一样的,因此我们可以把这三个命令分成两个类,分别是git rebase和git merge。

  1.1 共同点

    首先说一下共同点,首先两者的作用都是实现两个分支的合并。另外两条命令都是本分支送到别的分支上的,也就是说,如果你有一个主分支master,另外你有一个你用来写代码的分支test,那么如果你想把test分支merge或者rebase进入master,你就需要处在test中,使用git merge/rebase master把test的代码合并到master中。

  1.2 区别

    接着说一下两者的区别,rebase的原始作用是变基,换句话说需要把自己某段分支的代码送到别的分支上,也就是说,它是以本分支作为基本的,而merge则不同,它是按照两条分支作为基础的,如果说两者之间发生冲突,那么是不能继续的。这个可能大家现在理解有点难度,等看到后面就会理解的。

  1.2.1 git rebase和git merge --no-ff的区别

    之所以说这两个命令,是因为这两个命令在执行过后所呈现的效果让人比较好理解。简单来说,git rebase XXX(变基分支),其结果如图所示。

  如图,分支一是master分支,分支二是test分支,如果我们想把test的分支rebase进入master分支中,那么他所呈现的效果就是1-2-3-4-5-6,换句话说,他把test上的分支移动到了master分支上,如果在报冲突时我们一路skip,那么它最后得到的结果就是test上我们所写的代码。也就是说test的分支结果移动到了master分支之后

  而git merge --no-ff则刚好相反,我们还拿上一个做例子,如果我们用git merge XXX --no-ff,那么我们得到的结果就是1-2-5-6-3-4-7(为什么会有7我们稍后解释)。换句话说,我们把test上的代码移动到了merge之前。具体请看图

  1.2.2 git merge和git merge --no-ff的区别

    ok,接着我们说一下git merge和git merge --no-ff的区别,首先正如我前面所说的,两者所实现的功能其实是一样的,都是实现代码合并,实现的最终效果是一样的,但是no-ff有一个就是可以保存历史记录,举一个例子,比如我们现在有个主分支master提交记录为A-B-C,此时分出一个分支feature提交记录为D-E-F,如国此时用master合并feature,那么得到的结果一定是这样的:A-B-C-D-E-F,此时分支一定是指在F上面,而如果使用merge --no-ff,那么此时得到结果为A-B-C-D-E-F-G,当然从结果来看应该是一样的,但是如果你万一有一部分错了,需要回退,那么你就需要用到no-ff了,因为这样比较清楚。

  1.3 应用场景

    cherry-pick:这个很好理解,如果你想要某一次提交,那么你就用cherry-pick就行了。

    rebase:一般用于本地分支合并。原因是这样比较清楚。

    merge:一般用于远程分支合并,因为别人只会看你最后一次的提交。

  

  

猜你喜欢

转载自www.cnblogs.com/songyuchen/p/12082469.html
今日推荐