如何使用checkout命令重新创建冲突的文件状态?

时间:2016-11-16 11:31:35

标签: git merge

我有很长的生命分支,不久前我解决了大合并冲突。现在我想再次将master合并到我的分支中但是发生了冲突。我有点谷歌,发现rerere 功能。

但是当我这样做时:

git checkout --conflict=merge FileTheMergeConflictWas.ext

我一无所获。

如何创建合并冲突解决文件并使用自动解决方案完成当前合并?

2 个答案:

答案 0 :(得分:2)

如果您的合并已经提交,那么从某种意义上来说,它太迟了。 rerere代码的工作原理是在冲突发生时记录冲突,然后在解决冲突后(单独)记录冲突解决方案

过去,当git rerere未启用时,冲突本身以及之前的解决方案都发生了。因此,要让git rerere现在记录它们,您必须及时返回,启用git rerere,启动合并,获取冲突,解决冲突,然后回到现在。

如果您有方便的时间机器,您可以使用它。 :-)我们大多数人都没有,但幸运的是,Git 的时间机器!嗯,有点。

只需打开git rerere,然后使用历史记录查看正确的提交。这将给你一个"分离的HEAD"使用HEAD指向您刚签出的提交。哪个提交是正确的?当然,就在您上次合并之前的那个。这是现有合并提交的第一个父

然后,既然你有一个分离的HEAD并且处于正确的提交状态,那么执行合并会产生冲突:

git merge <hash-id>

提交合并的正确哈希ID是什么?为什么,当你上次合并时使用的那个,当然。这是现有合并提交的第二个父

这种合并当然会因冲突而失败。但是现在冲突已经被记录下来了,因为你过去和你的超级HEAD一起记录了这一次。现在以与之前相同的方式解决冲突。为了节省时间,您只需复制过去的正确分辨率即可。正确的解决方案是您提交的合并中的 。所以:

git show <merge-id>:path/to/conflict.ext > path/to/conflict.ext

现在git add已解析的文件(根据需要重复所有文件)并运行git commit以记录最终解决方案。

现在,时间旅行回到现在,放弃你刚才做的合并。它的目的是记录冲突和决议:

git checkout thebranch

现在你准备好了。

轻微的烦恼

如果您当前处于冲突合并或rebase的中间,则必须立即中止,然后使用Git时间机器返回并重新合并,然后重新启动冲突的合并或rebase。 (如果你有很多有用的工作,你可能想先保存它 - 只需将它提交到某个地方和/或创建一个指向当前提交的分支或标记名称,根据需要和适当 - 并且只有然后< / em> abort。)

答案 1 :(得分:0)

感谢 torek 。我在我的分支机构时完成了下一步:

git log --merges --oneline

30275e6 Merge branch 'master' into feature/5521_sign_cart_items
c28e258 Merge branch 'master' into feature/5521_sign_cart_items
f01e32c Merge branch 'master' into 5452_promocode

从第一行30275e6获取:

$ git show 30275e6
commit 30275e60ae49f0139d8a0537dd8dc215b7fa2908
Merge: e8d66f0 81249af
Author: Eugen Konkov <>
Date:   Tue Oct 25 19:57:16 2016 +0300

    Merge branch 'master' into feature/5521_sign_cart_items

我们需要此信息:Merge: e8d66f0 81249af。在e8d66f0掌握之前,master是我们分支上的最后一次提交。 81249af是当时对master的最后一次提交。看看当时的状态:

* b915f22 Code cleanup
*   30275e6 Merge branch 'master' into feature/5521_sign_cart_items
|\  
| * 81249af 5663 fixed
| * c4f02ae 5452 fixed
* | e8d66f0 Code cleanup

现在我应该使用时间机器(谢谢 torek ):

git checkout e8d66f0 # We are at detached head now
git merge 81249af

我遇到了冲突。现在我应该像以前一样解决。这是我合并30275e6

的结果
git checkout 30275e6 FileTheMergeConflictWas.ext
git commit

在此之后,我切换回我的分支并合并master

git checkout my_branch
git merge master

将使用已保存的分辨率。祝你好运; - )