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

时间:2009-12-17 02:30:19

标签: mercurial merge

我正在努力养成进行代码审查的习惯,但合并一直使这个过程变得困难,因为我不知道如何让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减少我的存储库中的合并次数......但这不是我的问题 - 我的问题是弄清楚合并后发生了什么变化。

2 个答案:

答案 0 :(得分:12)

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

正在运行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)的所有内容,这是有道理的。< / p>

从你的问题来看,看起来你正在寻找一种说法:

  

告诉我这个变更集中的每一个大块都没有出现在其父母中,并向我展示其父母中存在的每个大块3中都没有。

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

答案 1 :(得分:0)

为了进行代码审查,您确实只想查看正在审核的项目中的更改。为此,我们为每个故事使用一个新分支,并使用拉取请求来突出显示更改,在创建拉取请求之前将所有更改合并到故事分支中。我们在bitbucket上托管我们的代码,审查/拉取请求工具非常好,提供了并排差异。

Pull requests with side-by-side diffs