0


git merge与git rebase详解

参考:

    http://t.csdn.cn/CkVrR

    https://blog.csdn.net/weixin_42310154/article/details/119004977

一、简单图示

(1)merge

这里写图片描述

(2)rebase

这里写图片描述

经验:

    一般来说,不推荐使用rebase。

    但为了让分支树看起来更简化,个人分枝偶尔也会选用rebase。这样可以线性的看到每一次提交,并且没有增加提交节点。  但这样会存在缺陷:公共分支上rebase会打乱且篡改提交记录,若别人想看该公共分支的历史提交记录,它看到的不是完整的历史记录。

    并且正在开发的其他分支会定期从master上合并代码,使开发分支保持最新。由于在master执行了rebase,maser历史会形成全新的提交。当合并过来后,git会认为和本地开发分支不一样,增加冲突可能性,更不知道代码提交顺序性,造成许多诡异现象。

二、区别

1、rebase 的冲突需要一个一个解决,如果有十个冲突,得先解决完第一个,然后执行如下命令后才会出现第二个冲突,直到所有冲突解决完。而merge 是一次性将所有的冲突都显示出来。

git add -u
git rebase --continue
  • rebase工作流
  • git rebase while(存在冲突) { git status 找到当前冲突文件,编辑解决冲突 git add -u git rebase --continue if( git rebase --abort ) break; }
  • merge工作流
  • git pull编辑冲突文件git add .git commit -m "feat: this is a comment"git push

另外,在rebase过程中,若想中途退出并恢复到rebase前的代码,可以用命令:

git rebase --abort

三、适用场景

  • git merge适合公共分支,将其他分支合并到公共分支,merge操作两个分支最新的提交点会形成新的一个提交点,使后合并进来的commit记录仍然保持在后边。(merge以后会多出无意义的一条提交记录“Merge … to …”)
  • git rebase适合个人分支(只自己一个人提交)。日常开发过程中,个人分支代码需要和公共分支代码保持一致最新,定期合并公共分支代码到个人分支。执行rebase操作后,会从指定分支上合并别人新的commit在我们的commit之前。(缺点是rebase以后就不知道当前分支最早是从哪个分支拉出来的了,因为基底变了)

四、图解举例演示说明

背景:

    两个分支master和feature,

    其中feature是在提交点B处从master上拉出的分支;

    master上有一个新提交M,feature上有两个新提交C和D;

在这里插入图片描述

    此时在feature分支上,执行 **git rebase master** 命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动)。

下图为变基后的提交节点图:

在这里插入图片描述

解释下工作原理:

  • feature:待变基分支、当前分支

  • master:基分支、目标分支

      rebase,变基,可以直接理解为改变基底。
    
      feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交暂存下来,然后删掉原来这些提交,再找到master的最新提交位置,把暂存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了M而不是原来的B了。
    

(注意:如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)

上面的例子也可实例化为如下工作场景:

    张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。
标签: git

本文转载自: https://blog.csdn.net/qq_35535785/article/details/126269443
版权归原作者 Snoring cat 所有, 如有侵权,请联系我们删除。

“git merge与git rebase详解”的评论:

还没有评论