为什么重新合并会导致 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
方面 - 与每个冲突其他.
如果您当前在分支 feature1
1 并且想查看自最近的共同祖先以来 master
发生了什么变化:
git diff feature1...master # three dots
要查看此后 feature1
本身发生了什么变化,请颠倒名称:
git diff master...feature1 # still 3 "."s
三点形式指示git diff
使用git merge-base
寻找合并基。然后根据右侧的名称进行差异。
1实际上,您根本不必在分支机构。如果您 在分支上 ,则可以使用 HEAD
快捷方式:git diff ...master
和 git diff master...
.
假设我们有一个 "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
方面 - 与每个冲突其他.
如果您当前在分支 feature1
1 并且想查看自最近的共同祖先以来 master
发生了什么变化:
git diff feature1...master # three dots
要查看此后 feature1
本身发生了什么变化,请颠倒名称:
git diff master...feature1 # still 3 "."s
三点形式指示git diff
使用git merge-base
寻找合并基。然后根据右侧的名称进行差异。
1实际上,您根本不必在分支机构。如果您 在分支上 ,则可以使用 HEAD
快捷方式:git diff ...master
和 git diff master...
.