【发布时间】:2013-04-04 01:41:13
【问题描述】:
使用 Mercurial,我如何列出自该分支的最后一次合并以来通过合并分支应用的所有变更集?
【问题讨论】:
使用 Mercurial,我如何列出自该分支的最后一次合并以来通过合并分支应用的所有变更集?
【问题讨论】:
修订集是您的朋友。或者你的克星,取决于它们的复杂程度:)
以下命令将显示最后两次合并之间的所有关联变更集:
$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge()))"
这个复杂的小表达式(我稍后会简化它)执行以下操作:
x:y 为您提供 x 和 y 之间的所有变更集merge() 是一个包含所有合并的修订集。last(...,n) 给出集合的最后 n 个变更集,n 默认为 1first(...) 为您提供集合的第一个变更集ancestors(last(merge())) 是包含上次合并的所有祖先的集合结合所有这些,上面的表达式变成(准备好了吗?):给我最后两个合并中的第一个和最后一个合并之间的所有变更集,包括在内,它们恰好是最后一次合并的贡献祖先。
ancestors(...) 位过滤掉所有不相关的变更集。
您可以通过添加& branch(branchname) 将其限制为特定分支上的更改。例如,如果您要从 default 合并到 release 分支,您可以这样做:
$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge())) & branch(default)"
这不包括实际的合并本身,因为它们会出现在 release 分支上。
希望这是有道理的 - 今天下午我会看看是否可以找到更简单的方法,但这是第一个浮现在脑海中的方法。同时,如果你使用它,你可以通过在你的用户 hgrc 文件中创建一个 revset 别名来使它更容易:
[revsetalias]
contrib = first(last(merge(),2)):last(merge()) & ancestors(last(merge()))
所以你可以使用:
$ hg log -r "contrib"
$ hg log -r "contrib & branch(default)"
欲了解更多信息,请查看hg help revsets。
【讨论】:
我不确定 icabod 的解决方案是否完全正确。让我看看能不能解释一下。
让我们来看看这张变化图。
o----A1----A2----M1--------A3---M2
\ / /
---B1----B2--- /
\ /
----C1--------C2----C3
B 是取自 o 的分支,C 是取自 B1 的分支。如果我们在 M2 并运行 icabod 的命令,那么:
last(merge()) 是 M2
first(last(merge(),2)) 是 M1
所以表达式变成:
hg log -r "M1:M2 & ancestors(M2)"
M1:M2 是在M1 和M2 之间的修订号,在这种情况下是A3、C2 和C3,它完全忽略了C1。
我认为您正在寻找 M2 的一组祖先,而不是 M1 的祖先。即
hg log -r "ancestors(M2) & not ancestors(M1)"
或
hg log -r "ancestors(last(merge())) and not ancestors(first(last(merge(), 2)))"
我认为这应该是C1、C2、C3 和A3。它还有一个优点,即它不关心更改集是如何或何时添加到 repo 中的。
唯一的问题是倒数第二个合并不是最新合并的祖先。我将把它作为练习留给读者;-)
当然,所有这些都可以通过在合并之前执行 hg merge --preview(或 -P)来避免,它会列出在您执行合并时将包含的所有变更集。
【讨论】:
merge --preview。让我想知道是否应该有一个类似的命令来检查事件 after 的合并,如果有的话,知道在哪里停止输出会很棘手......我猜在哪里两个分支分支。