我正在努力养成进行代码审查的习惯,但合并一直使这个过程变得困难,因为我不知道如何让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
减少我的存储库中的合并次数......但这不是我的问题 - 我的问题是弄清楚合并后发生了什么变化。
答案 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上托管我们的代码,审查/拉取请求工具非常好,提供了并排差异。