我有很长的生命分支,不久前我解决了大合并冲突。现在我想再次将master
合并到我的分支中但是发生了冲突。我有点谷歌,发现rerere
功能。
但是当我这样做时:
git checkout --conflict=merge FileTheMergeConflictWas.ext
我一无所获。
如何创建合并冲突解决文件并使用自动解决方案完成当前合并?
答案 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
将使用已保存的分辨率。祝你好运; - )