在 'hg rebase' 冲突期间,我如何才能看到我在历史上的地位?

How can I see my place in history during an 'hg rebase' conflict?

每当我执行 hg rebase 并且存在合并冲突时,它会立即为我调出一个编辑器来解决冲突。但是,它没有给我任何关于我在变基过程中所处位置的信息。例如,如果我的历史如下所示:

      o  12
      |
      o  11
      |
10 o  |  
    \ /
     o  9

执行hg rebase -s 11 -d 10可能会在尝试应用 11 或 12 时发生冲突。仅从我停止的合并冲突中很难一眼看出,尤其是当图形大于此时。我如何知道冲突发生在变基过程中的哪个位置?

(确切地说不是答案,但评论有点长...)

当你写:

Performing hg rebase -s 11 -d 10 may have a conflict trying to apply either 10 or 11.

你的意思是写

may have a conflict trying to apply either 11 or 12

?因为您正在尝试将这些 csets 变基为 10,所以谈论应用 10 是没有意义的。另外,如果您还没有使用 Evolve 扩展,请考虑使用。它使所有内容都只能追加,这要好得多。

此外,在克隆中进行测试。而且,如果可能的话,先尝试 rebase 12。无论如何,Mercurial 只是试图对 11 和 12 的更改进行 rebase,我认为它没有区分这些更改。为什么你会期望它?哪些更改属于哪个 cset 对您来说不是很明显吗?

另外,考虑配置合并设置以供 kdiff3 使用,如果您还没有这样做的话。它使在合并编辑器中做事变得更加清晰,您还可以清楚地看到合并的双方。看 https://www.mercurial-scm.org/wiki/MergeToolConfiguration and https://www.mercurial-scm.org/wiki/KDiff3

就我个人而言,我的 ~/.hgrc 中有以下几行,但它们已经存在很长时间了,我不记得是从哪里得到的。另外,这些天我不怎么合并。但不管它值多少钱...

[merge-tools]
kdiff3.args=--auto --L1 base --L2 local --L3 other $base $local $other -o $output
kdiff3.regkey=Software\KDiff3
kdiff3.regappend=\kdiff3.exe
kdiff3.fixeol=True
kdiff3.gui=True
kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child

希望对您有所帮助。

最近的 Mercurials 有两个配置选项:[ui] mergemarkertemplate[ui] pre-merge-tool-output-template,可以用来稍微改善这种情况。

pre-merge-tool-output-template

pre-merge-tool-output-template 在 运行 任何外部合并工具之前打印。这可以用来在你的编辑器或 kdiff3 弹出之前打印一些东西;请注意,如果您使用基于终端的合并工具(例如大多数编辑器,除非它们是 gui 版本),它可能会被合并工具隐藏。根据 OS 和您使用的程序,您可以按 Ctrl-Z 暂停合并工具以查看此输出。

示例输出:

merging path/to/file

Running merge tool for path/to/file (/usr/bin/vim):
- local (working copy): 10:2d1f533d add binary file (#2) tip default
-          base (base): 6:abcd1234 some other description default
-    other (merge rev): 9:1e7ad7d7 add binary file (#1) default
... vim runs here ...

请参阅 https://www.mercurial-scm.org/repo/hg/file/14589f1989e9/tests/test-merge-tools.t#l1956 了解生成该输出的模板,请参阅 hg help config.ui.pre-merge-tool-output-templatehg help templates 了解更多信息。

mergemarkertemplate

mergemarkertemplate 控制您在编辑器中看到的冲突标记。设置 [ui] mergemarkers=detailed 并查看是否足够;如果没有,可以使用[ui] mergemarkertemplate自定义;这也可以在每个合并工具的基础上进行自定义,因此请参阅 hg help config.ui.mergemarkershg help config.ui.mergemarkertemplatehg help config.merge-tools.

带有可自定义标签的程序

kdiff3 等合并工具通常能够自定义标签。在默认配置中,这应该是 base/local/other 的操作提供的名称(在我上面的示例中,这分别是 baseworking copymerge rev。我相信如果您有 [ui] mergemarkers=detailed[merge-tools] kdiff3.mergemarkers=detailed,这些将包含更多信息。有关每个合并工具配置选项的更多信息,请参阅 hg help config.merge-tools