使用 Mercurial,我如何列出自该分支的最后一次合并以来通过合并分支应用的所有变更集?
2 回答
Revsets是你的朋友。或者你的克星,取决于它们的复杂程度:)
以下命令将显示最后两次合并之间的所有关联变更集:
$ 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)
。例如,如果您release
要从 合并到一个分支default
,您可以执行以下操作:
$ 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 的祖先。IE
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
(or -P
) 来避免,并且它列出了执行合并时将包含的所有更改集。