【问题标题】:Mercurial commands for merging both conflicting and non-conflicting changes用于合并冲突和非冲突更改的 Mercurial 命令
【发布时间】:2015-11-25 12:03:38
【问题描述】:

Mac Yosemite (10.10.5) 上的 Mercurial 3.4.1 在这里。我不知道为什么我觉得hg 如此混乱。几周前我克隆了一个 repo,并且一直在到处寻找它。我现在准备将所有更改推送到远程hg 服务器,但同时其他几个开发人员也进行了更改(冲突和非冲突)。本项目针对default使用纯主线开发(无分支)。

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

  • Exact 命令将自动合并所有不冲突的更改;和
  • Exact 命令将弹出打开编辑器并允许我查看和手动合并冲突的更改

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

看了hg merge doc,我现在比以前更糊涂了!该文档没有在哪里指定如何将我的本地default HEAD 与远程default HEAD 显式合并。此外,该文档提到:

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

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

【问题讨论】:

    标签: merge mercurial


    【解决方案1】:

    hg merge 命令将当前工作目录中的文件与-r 参数指定的修订版中的更改合并(如果当前工作目录是分支头的签出并且该分支正好有一个其他头,然后自动推断要合并的其他修订版)。然后可以提交合并的结果,并且(在提交时)成为这两个修订的子修订。因此,您通常会这样做:

    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 列出它在不实际执行的情况下会做什么。

    【讨论】:

      【解决方案2】:

      合并始终是一种本地操作,您可以将一个修订版从另一个分支或头部合并到另一个修订版中。

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

      【讨论】:

      • 感谢@planetmaker (+1) - 如果您不介意,请进行一些跟进。听起来您说我需要:(1) 运行 hg merge,它将自动合并非冲突更改并用标记标记冲突更改 (yes??)。然后 (2) 我需要在差异工具中打开我的修订版,然后它将可视化这些标记 (yes??)。最后,(3)一旦我手动合并并将所有这些冲突标记为“已解决”,我应该能够执行hg pushyes??)。感谢您在这里的任何澄清/确认!
      • 无论您配置什么合并工具,它们都会很好地合并不冲突的更改(否则它们将成为坏工具)。如果您使用内部合并,请在您的项目中搜索合并标记并更改代码位置以使其正常。然后标记一切已解决和commit。推送与合并无关。
      • 再次感谢@planetmaker (+1) - 我真的不想在这里变得困难,但我认为你的答案是基于一些我不知道的“假设知识”(在这个点)有。假设我想使用 KDiff3。 我是运行hg merge然后打开 KDiff3,还是只打开 KDiff3 并从其内部运行合并?
      • 如果配置正确,kdiff3 将自动打开一个包含文件的窗口,您可以在其中即时解决冲突,并在合并期间发生合并冲突时保存更正的源。
      猜你喜欢
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2010-10-22
      • 2012-10-29
      相关资源
      最近更新 更多