在mercurial中,如何在合并变更集和一个父变量之间看到差异,而不更改另一个父变量?

Geo*_*eng 11 mercurial

考虑一下这个简单的回购:

mkdir temp
cd temp
hg init
echo abc > file1
hg ci -A -m init
echo def >> file1
echo hey > file2
hg ci -A -m A
hg up -r0
echo ghi >> file1
echo hey > file3
hg ci -A -m B
hg merge
hg ci -m merge
Run Code Online (Sandbox Code Playgroud)

在合并期间,取"ghi"(哪一方并不重要).

DAG是:

0 - 2 - 3
 \- 1 -/
Run Code Online (Sandbox Code Playgroud)

hg diff -r1:3 显示file1更改和新文件3.

hg diff -r2:3显示新文件2.对于hg log -p -r3和相同hg st --change 3,因为2是第一个父级.

我的问题是:我怎样才能看到1和3之间的变化减去2中的变化,这在概念上是d(1:3) - d(0:2)什么?

我希望只看到file1的变化.hg log -r3 -v只显示"files:file1"(我猜因为它是更改ctx中的唯一文件),但奇怪的是,hg log -r3 --debug还显示"files +:file2".

如果我运行hg view(由捆绑的hgk扩展提供)并单击r3,它只显示file1.我无法读取tcl/tk代码,但似乎技巧是在一个contmergediff函数中,它获取合并中的文件列表,其中它以某种方式省略了file2.

FWIW,TortoiseHg与上述所有不同:点击r3在文件列表中显示"M file1"和"A file2",但在file1中没有显示实际的变化.单击"其他父级"显示"M file1"和"A file3",这与"diff -r1:3"相同.

一个现实世界的用例是这样的:r1是我的,而r2是同事的.早些时候,同事审查了r1(差异0:1),但在要求审查r2之前他没有将其合并.所以我回顾了r2(差异0:2),后来他做了合并.然后,当我看到差异1:3时,我不得不忘记我曾经审查过r2.如果merge diff很小,我可以使用hgk.但如果它很大,我真的需要在vdiff中看到它.


(更新)现在有一个mergediff扩展.如果有人尝试并发现它有效,请添加答案.

Obe*_*nne 6

这是一个猜测(虽然我不确定它是否真的符合你的要求).命令

$ hg log --template {files} -r <merge-revision>
Run Code Online (Sandbox Code Playgroud)

列出已通过合并更改的文件.此输出可用作diff命令的文件列表,以仅显示您感兴趣的更改.

应用于您的示例,以下内容应显示合并对在修订版1中贡献所做的操作:

$ hg diff -r 1:3 `hg log --template '{files}' -r 3`
diff --git a/file1 b/file1
--- a/file1
+++ b/file1
@@ -1,2 +1,2 @@
 abc
-def
+ghi
Run Code Online (Sandbox Code Playgroud)

同样,下面的命令应该向您展示合并如何影响您的同事在修订版2中更改:

$ hg diff -r 2:3 `hg log --template '{files}' -r 3`
# no output, since your colleague decided to keep her *ghi*
Run Code Online (Sandbox Code Playgroud)

  • 最近我写了[博客文章说明了这个问题,我的答案更加详细](http://obensonne.bitbucket.org/blog/20110315-what-the-merge.html). (2认同)