用于合并冲突和非冲突更改的Mercurial命令

时间:2015-11-25 12:03:39

标签: merge mercurial

Mac Yosemite(10.10.5)上的Mercurial 3.4.1。我不知道为什么我发现hg如此令人困惑。几个星期前我克隆了一个回购,并一直在那里啄它。我现在准备将所有更改推送到远程hg服务器,但其他几个开发人员同时进行了更改(冲突和非冲突)。该项目使用纯主线开发(无分支)对default

我运行hg add .然后hg commit -m "Fixing x, y and z.",现在我需要将我的本地default HEAD与远程/来源default上的hg HEAD合并服务器。所以我需要:

  • 完全命令会自动合并所有非冲突的更改;和
  • 完全命令将弹出一个编辑器并允许我查看并手动合并有冲突的更改

不确定它是否有所作为,但我的很多更改也重构了基本项目结构(删除/重命名/移动了源文件和目录)。所以这些变化应该非常重要。

阅读hg merge doc,我现在比以前更加困惑了!该文档没有指定如何将我的本地default HEAD与远程default HEAD显式合并。此外,文件提到:

  

" hg resolve"必须用于解决未解析的文件。

什么是未解决的文件?!?我必须先将之前的命令运行到hg merge吗?它如何影响/与合并过程相互作用?

2 个答案:

答案 0 :(得分:3)

hg merge命令将当前工作目录中的文件与-r参数指定的修订版本中的更改合并(如果当前工作目录是分支头部的结帐并且branch正好有另一个头,然后自动推断合并的另一个修订版)。然后可以提交合并的结果,并且(在提交时)成为这两个修订的子修订版。你通常做的是:

hg update ORIGINAL_REVISION
hg merge -r NEW_REVISION

ORIGINAL_REVISIONNEW_REVISION都可以按照hg help revisionshg help revsets中的说明进行指定。

hg merge的结果是将NEW_REVISIONORIGINAL_REVISION的变化结合起来的结果。每当Mercurial可以在没有任何明显冲突的情况下组合变更时,它就会这样做。请注意,hg merge不会提交组合更改,而只会更新工作目录;提交它们来创建合并提交是一个单独的步骤。

如果发生冲突会怎样?如果有可用的合并工具(Mercurial将尝试熟悉可用的合并工具并从列表中选择一个,它知道一个是否可用,但您可能必须明确指定它,例如通过--tool选项;有关详细信息,请参阅hg help mergetools),此工具将启动,您可以在那里解决冲突。如果列表中没有可用的工具且您没有指定工具(通过.hgrcHGMERGE环境变量或--tool选项),Mercurial将退回到其内部冲突解决工具(相当于--tool :merge),它只是将冲突标记添加到文件中,然后可以在您选择的编辑器中手动解析,或者使用知道如何处理此类冲突标记的工具。

您可以使用hg resolve查看和更新​​有冲突的文件列表。具体来说,hg resolve -l将列出存在冲突的文件,如果冲突已解决(例如,通过合并工具或因为您将其标记为已解决),则会列出前缀为R的文件或U冲突仍未解决。您可以使用hg resolve -m FILEFILE标记为已解决,或hg resolved -u FILE将其标记为未解析(您还可以提供文件列表或-a来标记所有文件)。您可以使用hg resolve --tool TOOL FILEhg resolve FILE重做特定文件的合并。

一旦hg resolve -l显示没有更多未解决的冲突,您就可以提交合并。

如果在合并期间的任何时候你的工作目录最终处于你似乎无法恢复的状态,hg update -C将中止合并并撤消整个合并(注意:你将失去任何合并的解决方案,你到目前为止已经完成了。)

如果(如您所示)您还重命名或删除了文件,则可能需要额外的工作。通常,您应该使用hg mv重命名文件,hg cp复制文件,hg rmhg forget删除它们。这将通知hg merge他们的共同祖先是什么,并允许将两个分支的更改合并到同一个文件中,即使两个分支都将它们放在不同的文件中。如果你不这样做,你可以使用hg addremove -s PERCENTAGE尝试让Mercurial巧妙地发现重命名和副本(请注意,在提交或合并更改之前,仍然需要完成此操作)。 -s / --similarity参数是一个百分比(默认为100),表示相似文件必须是多少才能被视为彼此的重命名/副本。您可以使用-n--dry-runhg addremove列出无需实际执行操作的内容。

答案 1 :(得分:1)

合并总是一个本地操作,您可以将另一个分支或头部的一个修订合并到另一个修订中。

使用内部合并工具时,它会将冲突标记添加到需要内部干预的位置。您通常会访问这些文件,修复冲突,然后使用ID明确标记在这些文件中解决的冲突。在将并非所有这些合并冲突都标记为已处理之前,您无法提交合并。您可以将所有冲突标记为一次处理:hg resolve --mark FILE - 但请确保您实际处理了所有合并冲突,否则您的文件将被提交,其中剩余的合并冲突指示符可能不是您想要的。