当应用补丁时,有没有解决冲突的方法?

176

我在使用Windows系统。

由于各种原因,我们有多个不同的svn分支的git实例。

很多时候我想要解决一个A库的问题,生成一个补丁,并将其应用到B库。这可以很好地工作,但如果有冲突就会出现问题。

当进行变基时,我只需右键单击文件夹,使用tortoiseGit并选择解决选项。这会带来一个漂亮的图形界面,让我通过冲突。

是否有任何方法可以处理被拒绝的补丁块?

这是我目前创建/应用补丁的方法。

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch

3
当所有的修补选项都失败时,我通常会手动完成它。 - stdcall
如果合并失败,那是因为程序无法明确地执行合并操作。你会得到一个包含<<<<,====,>>>>标记的文件,需要手动解决它们。 - tacaswell
手动处理几百个拒绝块时真的很麻烦。 - Kenoyer130
1
这时候你需要使用 git mergetool 并选择你喜欢的 GUI 进行三方合并(我在 Windows 上偏爱 kdiff)。 - g19fanatic
5个回答

356

要生成您的补丁,请执行以下操作:

git format-patch --stdout first_commit^..last_commit > changes.patch
现在当你准备好应用这些补丁时:
git am -3 < changes.patch

-3 会在冲突时进行三方合并,此时您可以使用 git mergetool 前往gui界面或仅使用vim手动合并文件(使用标准的冲突解决方式:<<<<<<||||||>>>>>>)。


9
在使用git am时,添加--ignore-whitespace --ignore-space-change可能会很有用。如果没有这些参数,一些微不足道的合并可能无法成功。 - angularsen
27
git apply -3 changes.patch 对我也有效。 - peterflynn
3
尽管补丁无法完全应用,但我仍然从 git mergetool 得到了“不需要合并文件”的提示。相反,我必须找到原始补丁使用的基础提交,在其之上应用补丁(幸运的是我的代码库有此提交),然后进行变基。 - jozxyqk
8
我遇到了和@jozxyqk一样的问题。无论是git am -3还是git apply -3都没有在我的文件中插入冲突标记,即使我收到了像Applied patch to 'configure.ac' with conflicts.error: patch failed: ...这样的消息。这是在git 2.17.1上发生的。也许当一些文件根本无法打补丁时,git会回滚? - nh2
2
我遇到了与@nh2相同的问题,你找到问题了吗? - Eridanis
显示剩余6条评论

16
如果您在应用补丁、变基或合并操作时经常遇到相同的冲突集,可以使用 git rerere (重用记录的解决方案)功能。 这允许您预定义如何解决冲突,基于你在过去是如何解决它们的。 详见http://git-scm.com/blog/2010/03/08/rerere.html以了解其工作原理。

11

只需使用

git apply -3 <patch_name>

这将允许您解决冲突。


5

TortoiseGit有一个合并功能,可以打开补丁文件。

这里有一张图片这里


1
实际上,合并选项可能是我正在寻找的。 - Kenoyer130
真的吗?我很久没有使用过Tortoise了,但是链接页面上有这样的文字:“TortoiseMerge可以直接打开Git补丁文件,您可以查看并将其打入工作副本。”,所以它似乎应该可以! - ams
它确实可以打开补丁文件... 但是有时候,补丁文件格式会破坏 TortoiseGitMerge。我从来没有成功过使用 diff -u,而是用 diff -c 输出。 - thistleknot
您还可以在工作树文件夹上右键拖动补丁,并选择“应用补丁序列”(对于像0001-xxx.patch,... 0002-xxy.patch这样的补丁)或“应用单个补丁文件”。 - MrTux

4

我的做法是:

  • 创建一个“集成”分支,其中文件相同
  • 将补丁应用到此集成分支上
  • 将其合并或变基到主分支(不知道在这里使用变基是否有用,因为不知道在应用其他补丁时会发生什么)

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