使用TortoiseHg导入带有冲突更改的补丁到Mercurial代码库

9

我已成功地导入了补丁,没有出现冲突的更改。但是当我尝试导入具有冲突更改的补丁时,它会抛出一个错误,显示“Hunk#1 FAILED at 11..”。没有合并更改的选项。是否有其他方法来完成这个任务?


sylvanaar已经回答了你的问题,但值得注意的是,如果你知道要导入的补丁基于哪个版本(通常在注释中),你可以尝试使用hg更新到该版本并进行导入。假设你有正确的基础可用,你就可以使补丁干净地导入。 - Ry4an Brase
2个回答

5

但是对于更大的项目来说,这是不可能的。那么我需要手动解决更多文件的冲突。 - Jayantha Lal Sirisena
我认为需要建立一个工具来实现这个目的,Jayantha。 - Warren P

4

手动解决

TortoiseHg 2.1 版本以上提供了帮助你解决补丁拒绝块的工具。当你应用一个补丁并且它有拒绝块时,对于每个有拒绝块的文件,它会询问你是否想要解决被拒绝的块。如果你点击是,它就会展示一个屏幕,其中包含文件的内容(已应用成功的块)以及每个被拒绝的块,从而让你更轻松地手动进行更改,并标记每个块为已解决。

实现三方合并

有时候我处理大型拒绝块的方式是重新定位补丁。在 TortoiseHg 1.x 中,我可以选择一个节点,在另一个节点上右键单击并重新调整补丁。但在 TortoiseHg 2.x 中,他们还没有将此功能添加回来,但解决方法也不错。您仍然可以使用 hg rebase 在命令行上重新定位补丁。无论哪种情况,您需要启用 mqrebase 扩展(您可能已经启用了前者)。本答案不适用于教授如何使用 mqrebase(有很多其他的答案和文章可以做到这一点),所以我将假定您对它们有一定的熟悉度。

在两种情况下,您都需要将补丁应用于其基础修订版本(或应用干净或接近干净的修订版本)。

命令行:

  1. 运行 hg rebase -s patchRev -d tip与您在 rebase 命令上想要的任何其他开关一起使用。

    这将启动您的三方合并工具,以解决每个文件的冲突。

  2. 运行 hg qrefresh 确保合并结果被更新到补丁中。

TortoiseHg UI

  1. 将补丁完成为普通的变更集。
  2. 将该变更集变基到tip:
    • 更新到tip。这很重要,因为它用于设置变基操作的目标。
    • 右键单击临时变更集并选择变基以打开变基对话框。
    • 检查源和目标是否正确,然后单击继续。如果存在合并冲突,请单击出现的已解决链接以打开解决对话框。
    • 单击Mercurial Resolve让Mercurial尝试自动解决一些冲突。
    • 对于其余的内容,请使用Tool Resolve来为选定的文件带来3向合并。
    • 解决完所有问题后,在解决对话框上单击关闭
    • 在“变基”对话框上单击继续,然后单击关闭
  3. 现在右键单击位于tip的临时变更集,然后进入修改历史记录 > 导入到MQ。现在它又是一个补丁了。

我更喜欢后一种方法,因为它默认情况下可以防止Mercurial自动解决冲突。它允许我选择解决文件的顺序以及如何解决它们,并显示每个步骤的进度状态。


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