考虑以下情况:
git配置有rerere.enabled 1
,可以进行分辨率录制和重放。存在以下提交历史记录:
B
/ \
A---C---E master
\ \ /
D D'
提交B
已在master
与--no-ff
合并,以创建提交C
。
提交B
和D
包含对文件Foo
的冲突修改。
提交D
已重新定位为C
创建提交D'
- 仅Foo
中的更改错误地解决了D
中的冲突。正确的解决方案包括B
和D
的更改。
提交D'
已合并到master中以创建提交E
,并且由于提交Foo
而导致的B
更改已丢失而没有冲突。
后来的检查发现了这个错误。通过在git cherry-pick B
上执行master
来执行恢复尝试,目的是能够使用mergetool正确地手动解决冲突。然而,rerere开始并重播糟糕的分辨率。没有git rerere
次调用似乎能够显示或清除错误的解决方案。
处理这种情况的最佳方法是什么?是不是git中的一个错误,樱桃选择没有重新覆盖(我在版本2.9.2)?感觉就像经常会出现的东西,但我找不到文档中解决的例子(我可能很难搜索)。
请记住,这是一个非常简化的提交树。实际上,在几天之内,所显示的内容之间还有数十次提交 - 但发生的事情的实质如上所述。
答案 0 :(得分:0)
这是我做的,但有更好的方法吗?
似乎与git merge --no-rerere-autoupdate
的{{1}}无效。我能想到解决这个问题的最好方法是暂时应用git cherry-pick
,这是有效的 - 然后我可以git config --local --add rerere.enabled 0
没有自动解决方案,然后使用git cherry-pick B
来解决冲突。这有点痛苦 - 特别是因为你必须记住之后撤消配置设置,但它确实具有在diff工具中显示正确的合并基础的优势。
我尝试的另一种方法是使用git mergetool
(注意点)来获取索引中的更改,并使用git checkout B .
在我的差异工具中编辑git difftool --cached
。虽然这有效并且步骤较少,但它并没有为您提供合并基础,以便在差异中使用。