如何在解决冲突的过程中提交一个较长的Git合并请求

11

我有一个包含300多个冲突文件的大合并。我想使用Mergetool解决这些冲突,但我不可能在一次会议中全部解决完。如何提交合并请求,并稍后返回并继续相同的合并请求?通常情况下,如果索引中存在冲突,git不允许你提交。

1个回答

13

我猜您所说的“不能一次完成”实际上是指“想在完成之前做一些其他事情”,因为否则您可以将部分解决的合并保留在工作树中。

首先,在您付出任何努力之前,请注意,您可以简单地创建另一个克隆库——部分解决的合并可以留在其中一个库中,您可以在另一个库中进行其他工作。

尽管如此,如果您确实想要保存已经解决部分合并的工作,我的最佳建议是使用git rerere(REuse REcorded REsolutions)。

要开始使用,请确保将rerere.enabled设置为true-这将涵盖大多数常规用例。它会导致git rerere在合并冲突发生后立即自动运行-此时,您将看到形式如Recorded preimage for '<path>'的消息。当您提交合并时,它也会自动运行;然后,您将看到形式如Recorded resolution for '<path>'。的消息。稍后,当相同的有冲突的Hunk出现时,这些解决方案就可以被重用。

在您的用例中,第一个自动触发器将启动-预映像将被记录。但您还没有准备好提交合并,因此在解决一些有冲突的文件并将它们标记为已解决(将它们添加到索引)之后,您可以直接运行git rerere(无参数)。 它将为您标记为已解决的所有内容记录解决方案,但会忽略任何仍未解决的问题。然后,您可以简单地销毁尝试的合并(git reset --merge),下次尝试时,记录的解决方案将被重用!


1
哇,太不可思议了。我的意思是我不想在我的开发机器上留下一堆未提交的更改,以防灾难发生而持续数天。我宁愿定期向上游进行推送作为备份,以便协作者可以看到我的工作。阅读手册后,似乎rerere更改是本地记录的。有没有办法将它们存储在提交中?此外,您是否知道我是否可以在合并过程中打开此功能? - Reed G. Law
@Reed:嗯。如果rerere没有启用,使用它将会很棘手-我能想到的唯一办法就是在克隆中重新执行合并,并复制您已经解决的内容。而且正如你所说,这是本地存储。对于以提交形式提出部分合并的建议...老实说,我会把它弄乱:从git statusgit status --porcelain中转储未解决的冲突列表,然后添加所有东西,就好像它已经被修复了,并提交它,理解它在真正发布之前将被修改。 - Cascabel
1
@Reed:为了让它不那么笨拙,你可以分两步提交:解决一些冲突,添加它们,然后重置其他所有内容的“HEAD”。然后当你提交时,你将提交一个仅包含已解决内容的合并,所有未解决的事情都保持原样。然后,您可以添加所有未暂存(先前有冲突)的内容,并将其作为第二个提交进行提交。要稍后处理它,您可以检出第二个提交并执行混合重置(到第一个(合并)提交(git reset HEAD^),然后重新开始工作-知道所有“本地修改”都是冲突。 - Cascabel
谢谢。这就是我缺失的部分 ==> "你可以直接运行 git rerere(无参数)。它将记录你标记为已解决的所有冲突解决方案,但会忽略仍未解决的内容。" - spazm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接