何时在 Git 中使用'--no-ff'合并选项



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

--no-ff标志使合并始终创建新的提交对象,即使可以使用快进执行合并。这避免丢失有关特征历史存在的信息branch和groups将所有提交一起添加特色[…]

是的,它将创建更多的(空的)提交对象,但收益是比这个成本大得多。不幸的是,我还没有找到方法使--no-ff成为gitmerge的默认行为,但它确实应该是。

然而,了解Git工作流,建议不要使用--no-ff:

因此,您添加了一条新规则:"当您在功能分支中合并时,使用–-no-ff强制执行新的提交。"这就完成了任务,你就可以行动了上。[…]

--no-ff创可贴、破裂的bisectblame的奥秘都是将螺丝刀用作锤子的症状。[…]

对于不同的场景,这两种方法似乎都是合理的,但认为什么是"良好实践"

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

这实际上取决于你想要做什么;意思是";我使用--no-ff选项。当合并实际上没有任何意义,并且您可能使用了rebase时,就没有理由使用--no-ff

git的问题是,它是一个非常强大的工具,您可以通过多种方式使用它,其中大多数都没有错。问什么是";正确的方式";做这件事就像问什么是正确的绘画方式。

至少对我来说,这是一套我喜欢的不断发展的方法,团队中经常讨论我们希望如何在代码上进行合作——从中我们试图获得一种";它是如何在这里完成的&;标准,但这只是我们的做法。

对于带有单个提交的已完成分支的情况,不要使用--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>轻松地操作它

# 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个提交是否真的属于一个功能?

这实际上取决于您的工作流程以及如何使用分支。

假设您有一个"master"和两个功能分支"foo"one_answers"bar"正在开发中。

在这种情况下,分支的存在只是为了允许不同的开发人员在没有冲突的情况下工作,当功能完成时,它们需要合并到master中,并且知道这些功能是否在不同的分支中实现并不重要。

但是,如果分支"foo"one_answers"bar"指的是系统中的独立模块,则可以有不同的工作流。

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

您需要决定分支机构合并的历史对您的工作流程是否重要。

根据评论,我更喜欢rebasepull --rebase工作流。

最新更新