美文网首页Git/SVNGit使用Git
『 merge --ff』 VS 『 merge --no-ff

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

作者: York_魚 | 来源:发表于2017-05-20 14:14 被阅读112次

在合并分支时(如合并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

相关文章

  • 『 merge --ff』 VS 『 merge --no-ff

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

  • github

    github h git merge --no-ff dev -m "提交"

  • git入门笔记

    一个图看懂git merge合并和git merge --no-ff(禁用Fast forward模式)区别git...

  • git的冲突解决

    git checkout develop git pull git merge --no-ff m_23___ 解...

  • git merge --no-ff

    执行合并时,如果设定了non fast-forward 选项,即使在能够 fast-forward 合并的情况下也...

  • git merge or rebase

    1.git merge --no-ff指的是强行关闭fast-forward方式。 fast-forward方式就...

  • git使用-merge、--no-ff、rebase

    一、--no-ff 使用和不使用的区别 1、能够fast-foward情况下,即切出分支后,主分支没有任何改动: ...

  • git merge 的奥秘

    Git 合并时 --no-ff 的作用 1.git merge(默认快进模式) Git 合并两个分支时,如果顺着一...

  • Git Learning Part 2

    Tips 1.merge参数 合并分支时加上参数 —-no-ff参数使用普通模式合并,合并后会有历史记录,使用 f...

  • git rebase、git merge --no-ff和git

    前提条件:存在两个本地分支: 1. git rebase 执行流程 git log查看的效果如图红色圈里的部分: ...

网友评论

    本文标题:『 merge --ff』 VS 『 merge --no-ff

    本文链接:https://www.haomeiwen.com/subject/lmbqxxtx.html