Mercurial:我怎样才能看到合并引入的变化?

Dav*_*ver 22 merge mercurial

我正在努力养成进行代码审查的习惯,但合并一直使这个过程变得困难,因为我不知道如何让Mercurial"只显示合并引入的更改,而这些更改并非存在于其父级中".

或者,稍微更正式(感谢Steve Losh):

向我展示合并中的每一块都没有出现在它的任何一个父母身上,并告诉我其父母中任何一个不存在于3中的大块.

例如,假设我有一个包含两个文件a和b的存储库.如果在修订版1中更改了"a",则在修订版2(在单独的分支上)中更改"b",并且这两个更改在修订版3中合并,我将获得如下所示的历史记录:

    @    changeset:   3
    |\   summary:     Merged.
    | |
    | o  changeset:   2
    | |  summary:     Changing b
    | |
    o |  changeset:   1
    |/   summary:     Changing a
    |
    o  changeset:   0
       summary:     Adding a and b

但是,如果我要求查看修订版3引入的更改hg di -c 3,Mercurial将向我显示同样的事情,就像我要求查看修订版1中引入的更改一样hg di -c 1:

    $ hg di -c 3
    --- a/a     
    +++ b/a     
    @@ -1,1 +1,1 @@ 
    -a 
    +Change to a
    $ hg di -c 1
    --- a/a     
    +++ b/a     
    @@ -1,1 +1,1 @@ 
    -a 
    +Change to a

但是,显然,这不是很有帮助 - 相反,我想被告知修订版3没有引入任何新的更改(或者,如果在合并期间发生冲突,我希望只看到解决方案冲突).就像是:

    $ hg di -c 3
    $

那么,我该怎么做呢?

ps:我知道我可以减少我的存储库中的合并次数rebase...但这不是我的问题 - 我的问题是弄清楚合并后改变了什么.

Ste*_*osh 12

简短的回答:你不能用任何股票Mercurial命令做到这一点.

Running hg diff -c 3将显示3它和它的第一个父项之间的变化- 即你运行时所处的变更集hg merge.

当你认为分支不仅仅是简单的变更集时,这是有道理的.当你运行时,hg up 1 && hg merge 2你告诉Mercurial:"将变更集合并2到变更集中1".

如果你使用命名分支,那就更明显了.假设2您的示例中的变更集位于名为的分支上rewrite-ui.当你运行时,hg update 1 && hg merge rewrite-ui你有效地说:"将rewrite-ui分支中的所有更改合并到当前分支中." 当您稍后运行hg diff -c此变更集时,它会显示合并引入default分支(或任何分支1)的所有内容,这是有道理的.

但是,从您的问题来看,您似乎正在寻找一种说法:

向我展示这个变化集中的每一个大块都没有出现在它的任何一个父母身上,并向我展示其父母中任何一个不存在的大块3.

这不是一个简单的计算(我甚至不确定我刚刚得到了正确的描述).我可以肯定地看到它会如何有用,所以如果你可以明确地定义它,你可能会说服我们其中一个阅读SO的Mercurial贡献者来实现它.