hg merge 命令将当前工作目录中的文件与-r 参数指定的修订版中的更改合并(如果当前工作目录是分支头的签出并且该分支正好有一个其他头,然后自动推断要合并的其他修订版)。然后可以提交合并的结果,并且(在提交时)成为这两个修订的子修订。因此,您通常会这样做:
hg update ORIGINAL_REVISION
hg merge -r NEW_REVISION
ORIGINAL_REVISION 和NEW_REVISION 都可以按照hg help revisions 或hg help revsets 中的说明进行指定。
hg merge 的结果将是NEW_REVISION 与ORIGINAL_REVISION 的更改组合的结果。只要 Mercurial 可以组合更改而没有任何明显的冲突,它就会这样做。注意hg merge 不会提交合并的更改,而只会更新工作目录;提交它们以创建合并提交是一个单独的步骤。
如果发生冲突怎么办?如果有可用的合并工具(Mercurial 将尝试对可用的合并工具进行智能处理,并从它知道是否可用的列表中选择一个,但您可能必须明确指定它,例如通过 --tool 选项;请参阅hg help mergetools 了解更多详细信息),此工具将启动,您可以在那里解决冲突。如果列表中没有可用的工具并且您没有指定一个(通过您的.hgrc、HGMERGE 环境变量或--tool 选项),Mercurial 将回退到其内部冲突解决工具(相当于--tool :merge),它将简单地将冲突标记添加到文件中,然后可以在您选择的编辑器中手动解决,或者使用知道如何处理此类冲突标记的工具来解决。
您可以使用hg resolve 查看和更新有冲突的文件列表。具体来说,hg resolve -l 将列出有冲突的文件,如果冲突已解决(例如,通过合并工具或因为您将其标记为已解决),则以 R 为前缀,如果冲突仍未解决,则以 U 为前缀。您可以使用hg resolve -m FILE 将FILE 标记为已解决或hg resolved -u FILE 将其标记为未解决(您也可以提供文件列表或-a 以标记所有文件)。您可以使用hg resolve --tool TOOL FILE 或hg resolve FILE 为特定文件重做合并。
一旦hg resolve -l 不再显示未解决的冲突,您就可以提交合并。
如果在合并过程中的任何时候您的工作目录最终处于您似乎无法恢复的状态,hg update -C 将中止合并并撤消整个合并(注意:您将丢失您拥有的任何合并分辨率到目前为止完成)。
如果(如您所指)您还重命名或删除了文件,则可能需要付出额外的努力。通常,您应该使用hg mv 重命名文件,使用hg cp 复制它们,使用hg rm 或hg forget 删除它们。这将通知hg merge 他们的共同祖先是什么,并允许合并从两个分支到同一个文件的更改,即使两个分支最终都位于不同的文件中。如果您没有这样做,您可以使用hg addremove -s PERCENTAGE 尝试让 Mercurial 智能地发现重命名和副本(请注意,这仍然必须在您提交或合并更改之前完成)。 -s/--similarity 参数是一个百分比(默认为 100),表示文件必须有多相似才能被视为彼此的重命名/副本。您可以使用-n 或--dry-run 让hg addremove 列出它在不实际执行的情况下会做什么。