使用Mercurial,我怎样才能列出自从上一次合并分支以来合并分支所应用的所有变更集?
答案 0 :(得分:4)
Revsets是你的朋友。或者你的克星,取决于他们有多复杂:)
以下命令将显示最后两个合并之间的所有关联变更集:
$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge()))"
这个复杂的小表达式(我将在后面简单介绍)会做到以下几点:
x:y
为您提供x
和y
之间的所有变更集merge()
是包含所有合并的revset。last(...,n)
给出了一组的最后n个变更集,n
默认为1 first(...)
为您提供了一套ancestors(last(merge()))
是一个包含上次合并的所有祖先的集合结合所有这些,上面的表达式变为(准备?):给我在最后两个合并中的第一个和最后一个合并之间的所有变更集,这恰好是最后一次合并的祖先。
ancestors(...)
位过滤掉任何不相关的变更集。
您可以通过添加& branch(branchname)
将此限制为特定分支上的更改。例如,如果您要合并到release
的{{1}}分支,则可以执行以下操作:
default
这不包括实际的合并本身,因为它们会显示在$ hg log -r "first(last(merge(),2)):last(merge()) & ancestors(last(merge())) & branch(default)"
分支上。
希望这是有道理的 - 今天下午我会看看我是否可以采用更简单的方式,但这是第一个让人想起的东西。与此同时,如果您使用此功能,则可以通过在用户hgrc文件中创建revset别名来简化此操作:
release
所以你可以使用:
[revsetalias]
contrib = first(last(merge(),2)):last(merge()) & ancestors(last(merge()))
有关详细信息,请查看$ hg log -r "contrib"
$ hg log -r "contrib & branch(default)"
。
答案 1 :(得分:3)
我不确定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
。它还有一个优点,就是它不关心如何或何时将变更集添加到仓库中。
唯一的问题是,倒数第二次合并不是最新合并的祖先。我将把它作为读者的练习; - )
当然,在进行合并之前执行hg merge --preview
(或-P
)可以避免所有这些,并列出了合并时将包含的所有更改集