何时在Git中使用“–no-ff”合并选项

成功的Git分支模型build议在合并分支时使用--no-ff

--no-ff标志会导致合并始终创build一个新的提交对象,即使合并可以用快进执行。 这样可以避免丢失有关function分支历史存在的信息,并将所有提交的function组合在一起。 […]

是的,它会创build更多(空)的提交对象,但增加的成本要大得多。 不幸的是,我还没有find一种方法来使git合并的默认行为,但它确实应该是。

了解Git工作stream ,但是,build议不要使用--no-ff

所以你添加一个新的规则:“当你在你的特性分支中合并时,使用–-no-ff强制一个新的提交。”这样就完成了工作,然后继续。 […]

--no-ff ,折断和blame是所有使用螺丝刀作为锤子的症状。 […]

这两种方法对于不同的情况似乎都是合理的,但是什么被认为是“好的做法?

你什么时候用--no-ff ,什么时候不用,为什么?

这真的取决于你想要做什么。 我的经验法则是,如果合并“意味着什么”,我使用–no-ff选项。 当合并并不意味着什么,你可能已经使用了rebase,没有理由使用–no-ff

git的事情是它是一个非常强大的工具,你可以用很多方式使用它 – 其中大部分没有错。 问什么是“正确的方法”,就像问什么是正确的方式来绘制图片。

至less对我来说,这是一种不断演变的方式,我喜欢这样做,经常在团队中讨论我们如何在代码上进行协作 – 由此我们试图推导出一种“如何在这里完成”标准,但是这只是我们的做法。

对于单个提交完成的分支的情况,不要使用--no-ff ,只是将其快进,因为历史将会更简单和更less混乱。 很难说--no-ff在这种情况下--no-ff你带来什么好处,因为看到一个并行的开发只用一次提交,而不是顺序的一次提交:

 # No fast-forward $ git merge --no-ff awesome-feature * 3aa649c Merge branch 'awesome-feature' |\ | * 35ec88f Add awesome feature |/ * 89408de Modify feature-001.txt and fix-001.txt * c1abcde Add feature-003 # versus fast-forward $ git merge awesome-feature * 35ec88f Add awesome feature * 89408de Modify feature-001.txt and fix-001.txt * c1abcde Add feature-003 

对于多个单独提交的完成分支,您是否愿意保持这样一个事实:分支的开发是并行的,还是顺序的。 我可能会使用--no-ff进行多个提交,以便我可以直观地看到这个分支的工作,并且可以使用单个git revert -m 1 <sha-of-merge-commit>轻松操纵它git revert -m 1 <sha-of-merge-commit>如果我不得不。

 # No fast-forward $ git merge --no-ff epic-feature * d676897 Merge branch 'epic-feature' |\ | * ba40d93 Add octocat.txt | * b09d343 Add bye.txt | * 75e18c8 Add hello.txt |/ * 89408de Modify feature-001.txt and fix-001.txt * c1abcde Add feature-003 # versus fast-forward $ git merge epic-feature * ba40d93 Add octocat.txt * b09d343 Add bye.txt * 75e18c8 Add hello.txt * 89408de Modify feature-001.txt and fix-001.txt * c1abcde Add feature-003 

看看在这种快速合并的情况下,在提交消息本身没有附加信息的情况下,很难说最后3个提交实际上属于一个特征吗?

这真的取决于你的工作stream程,以及你如何使用分支机构。

假设你有一个“大师”和两个特色分支“foo”和“bar”在开发中。

在这种情况下,分支只存在于允许不同的开发人员工作而没有冲突的情况下,当特征完成时,需要将其合并到主分支中,并且知道这些特征是否在不同的分支中实现并不重要。

但是,您可以有不同的工作stream程,分支“foo”和“bar”是指系统中的独立模块。

在这种情况下,一些提交可能会改变模块范围之外的文件。 当您将这两个分支合并到主文件中时,特定模块外部的文件日志可能会变得混乱,难以知道这些更改来自哪里。

您需要确定分支合并的历史是否对您的工作stream程非常重要。

接下来的评论,我更喜欢rebase ,并pull --rebase工作stream。