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

时间:2010-12-01 21:17:40

标签: 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

在合并期间,取“ghi”(哪一方并不重要)。

DAG是:

0 - 2 - 3
 \- 1 -/

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

hg diff -r2:3显示新文件2。 hg log -p -r3hg 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 extension。如果有人尝试并发现它有效,请添加答案。

1 个答案:

答案 0 :(得分:6)

这是一个猜测(虽然我不确定它是否真的能满足你的需求)。命令

$ hg log --template {files} -r <merge-revision>

列出已通过合并更改的文件。此输出可用作 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

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

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