采用非直进式合并(git-merge-no-ff)

采用非直进式合并(git-merge-no-ff)

使用Git当合并一个分支是一个相当常见的操作。在某些情况下,Git会默认将尝试在快进模式合并一个分支。如果不使用快进合并有什么不同?

假设我从master创建一个名为speedup分支。在这个分支上工作一段时间(三个提交,那些白色的圆圈)后,当我完成工作时,我把它git push推到我自己的远程分支。同时,主分支master什么都没发生,但仍处于相同的状态之前,我分出。这种情况在下面的图中描述。

git push

一旦该项目的维护者得到通知,我的分支已经准备好合并进master,她可能使用git的常规步骤git fetch操作后执行git merge来合并。因为主分支并没有新的提交(灰色圆圈),Git会用快进执行合并。整个系列的提交将是线性的。历史会像下图(左侧)。

git merge

合并的另一个变型是使用 -no-ff 选项(它代表不快进)。在这种情况下,分支历史看上去稍有不同(右侧),有一个附加的提交(虚线圆)强调合并。这个提交告诉我们有关合并分支的备注信息。

Git的默认行为是尽可能使用快进。这可以改变的,非快进模式可以很容易地设定为默认合并模式

设置非快进模式合并为默认合并方式 git config branch.master.mergeoptions “–no-ff”

总之,非快进合并保持明确分支的概念。它可在保留分支复杂的非线性提交历史。在另一方面,快进合并保持线性历史上的变更,使其更容易使用其他工具(log, blame, bisect)。每个分支的来源将变得很不明显,但如果该项目强制要求提交信息和问题跟踪器之间的严格的交叉引用,这也不是什么大不了的事。

你喜欢哪一种呢,快进式或非快进式?

翻译自: Fast-Forward Git Merge

0%