为什么重新合并会导致 git 中重复出现合并冲突?

Why does re-merging result in a repeated merge conflict in git?

假设我们有一个 "master" 分支,在 2 年内有 1000 次提交。我们有一个长期存在的功能分支 "feature1",大约 2 个月大(当时从 master 分支出来),有 100 次提交。我们继续在 master 和 feature1 上工作,偶尔将 master 合并到 feature1 中(每 2 天大约 5 次提交)以防止它漂移得太远。每次我们这样做时,特定的合并冲突都会不断发生,每次都是相同的(我手动解决)。为了完整起见,在本例中它是一个 JavaScript 项目。

我的问题:为什么 git 不是 "remember" 我第一次如何解决这个冲突并为后续合并使用相同的解决方案?

可能有助于回答的可选皱纹:

我的直觉是,如果我从 master 创建一个新分支,然后将 feature1 合并到结果中(我们称之为 "master+feature1"),相同的合并冲突将停止发生,随后从 master 到 master+ 的合并特征1。在实践中,我相信我已经看到了这一点,尽管我没有证据。证明或解释会很有趣,我相信它可以帮助解释我的主要问题的答案。

我对这个问题的变基不感兴趣。 (假设 feature1 被推送到共享远程并且不希望重新设置基准。)

Git 如果您 enable "rerere".

可以并且会记住以前的决议

没有更多细节,我不能说为什么你将 master 合并到 feature1 中总是遇到同样的冲突。我只能描述合并工作的一般方法:它找到你正在合并的东西的 "merge base"(最近的共同祖先)(master)和你所在的分支(feature1),然后找到 (git diff) 自该共同祖先以来在这两个分支中的每一个上所做的更改。如果只有一个 "side" 改变了一些东西,那里应该没有冲突,所以 "both sides" 必须做出改变 - 至少在 运行 git diff 方面 - 与每个冲突其他.

如果您当前在分支 feature11 并且想查看自最近的共同祖先以来 master 发生了什么变化:

git diff feature1...master   # three dots

要查看此后 feature1 本身发生了什么变化,请颠倒名称:

git diff master...feature1   # still 3 "."s

三点形式指示git diff使用git merge-base寻找合并基。然后根据右侧的名称进行差异。


1实际上,您根本不必在分支机构。如果您 在分支上 ,则可以使用 HEAD 快捷方式:git diff ...mastergit diff master....