『 merge --ff』 VS 『 merge --no-ff 』 VS『 rebase 』

在合并分支时(如合并develop分支到master分支),我们可以有以下命令的选择:

  • git merge // 等同于 git merge --ff
  • git merge --no-ff
  • git rebase

那么,这三者之间有哪些区别呢?对此,我将会通过下面的实验进行比较说明:

分支合并实验说明图.png

实验说明

在日常开发中,合并的两个分支(下面将会以日常用到的master分支和develop分支这2个分支进行举例),存在这2个情形:

  • master分支和develop分支无分叉:只有develop分支有更新
  • master分支和develop分支有分叉:两个分支均有更新

接下来的实验就是:分别在这两个情形下,分别通过 git merge --ffgit merge --no-ffgit rebase 命令把develop分支合并到master分支,然后比较合并后的master的commit-tree。

merge --ffmerge --no-ffrebase 各自合并的步骤如下:

  • 使用 merge --ff合并的步骤

    git checkout master
    git merge develop  // 等同 git merge --ff develop
    
  • 使用 merge --no-ff 合并的步骤

    git checkout master
    git merge --no-ff develop
    
  • 使用 rebase 合并的步骤

    git checkout develop
    git rebase master
    git checkout master
    git merge develop
    

实验结果

分支无分叉的场景下:

合并前:

合并前.png

分别执行merge/rebase后的情况对比:

  • 应用git merge --ff
merge-ff.png
  • 应用git merge --no-ff
merge-no-ff.png
  • 应用git rebase
rebase.png

分支有分叉的场景下:

合并前:

合并前.png

分别执行merge/rebase后的情况对比:

  • 应用git merge --ff
merge-ff.png
  • 应用git merge --no-ff
merge-no-ff.png
  • 应用git rebase
rebase.png

实验结论

通过结果图的对比,可以得到以下结论:

git merge --ff git merge --no-ff git rebase
分支无分叉 把develop上新的commit嫁接到master的最后commit上,效果等同于rebase,让master的commit-tree保持线性 生成一个新的commit用于记录这个合并操作 把develop上新的commit嫁接到master的最后一个commit上,让master的commit-tree保持线性
分支有分叉 合并时,由于存在冲突,生成一个新的commit用于记录此冲突,效果等同于 merge --no-ff 生成一个新的commit用于记录这个合并操作 通过rebase,把develop上新的commit嫁接到master的最后一个commit上,让master的commit-tree保持线性

怎么选择

通过合并结果对比可以知道,在合并时,我们就只需要『merge --no-ff 』和 『rebase』之间做选择即可。那么在日常开发中怎么选择呢?根据你的合并目的来:

合并目的 需要记录此次合并,如合并release分支 希望commit-tree整洁和成线性,如合并feature分支 对commit-tree无要求,适合初学者
合并命令 git merge --no-ff git rebase git merge

参考资料:
https://www.idaima.com/article/6773
http://www.jianshu.com/p/73ea5aca8bf3
http://www.jianshu.com/p/0613d8249863

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Git分支管理 master:主分支,当前分支上的代码随时可以直接发布,并且只能通过Pull Request从其他...
    UEUEO阅读 9,739评论 5 33
  • 1. GIT命令 git init在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个re...
    江边一蓑烟阅读 826评论 0 0
  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,468评论 2 8
  • 最近我的业绩似乎有了很大的提高,这也让我更加的努力,因为我想知道我到底能够达成多高的目标。可在这路上我错过...
    Time的记忆阅读 584评论 0 0
  • 曾几何时 我们都说,要活成自己喜欢的样子 走着走着 却发现,慢慢地开始有点讨厌自己 每一个年龄段 每一次人生的选择...
    电影夫人阅读 673评论 18 29