有两个分支,我如何找到两个分支合并的最新版本?是否有标准的Mercurial命令来做到这一点?
这与问题 How to find the common ancestor of two branches in SVN? 相同,但是对于Mercurial而不是subversion。
我不明白为什么Lazy Badger的答案是正确的,所以我不得不做一点画,现在我明白了:
当合并两个分支时,它们实际上并未“合并”,但是来自一个分支的更改将集成到第二个分支中。这意味着合并提交仅属于原始分支,而不属于合并分支。这就是合并修订是祖先修订的两个孩子之一的原因。
最好看一下这张照片:
default o----o----a---b---o---o
\ \
other `-o---o---m---o
ancestor(default,other) == a
children(ancestor(default,other)) == (b,m)
children(ancestor(default,other)) and merge() == m
答案 0 :(得分:19)
hg log -r "children(ancestor(default, Cleanup)) and merge()" --template "{rev}\n"
是默认和清理分支的最新合并(Tim Henigan的答案的完美版本)。
答案 1 :(得分:4)
在最新版本的Mercurial(> 1.7)中,您可以使用revsets执行此操作:
hg log -r "max(ancestor(<branch1>, <branch2>))"
同样的revset过滤器也适用于TortoiseHg的过滤器工具栏。
答案 2 :(得分:4)
您可以将此查询重写为:
假设您有两个由R1
和R2
标识的分支,可以是分支的名称,也可以是每个变量集的修订号或哈希值,或者诸如此类的东西。
然后您可以找到您正在寻找的变更集:
hg log --rev "ancestor(R1,R2)"
答案 3 :(得分:3)
如果您有两个以上的分支,那么您必须为Lazy Badger的答案添加一个额外的过滤器,因为children()可能还会为您提供不在您的分支中的子项。
hg log -r "children(ancestor(default, Cleanup)) and merge() and branch(default|Cleanup)" --template "{rev}\n"
other o---o-----m1---o
/
default o---o---a---b---o
\
another o---o-----m2---o
ancestor(default, other) == a
children(ancestor(default, other)) == (m1,b,m2)
children(ancestor(default, other)) and merge() == (m1,m2)
children(ancestor(default, other)) and merge() and branch(default, other) == m1
答案 4 :(得分:1)
对于子孙后代,如果左侧分支尚未与右侧分支合并,则左侧分支最近已合并到右侧。
正确的解决方案是:
last(parents((ancestors('{left_branch}') and branch('{left_branch}') and merge())) and branch({right_branch}))
答案 5 :(得分:1)
您可以使用此revset查询找到从源分支到目标分支的所有合并:
children(p2(::DESTINATION and merge()) and branch(SOURCE)) and branch(DESTINATION)
::DESTINATION and merge()
获取目标分支中的所有合并。 p2(set)
返回每个合并的第二个父级,它始终是源分支上的变更集,它已合并到目标分支and branch(SOURCE)
将所有这些合并过滤成来自源分支的那些。children(set)
返回p2()
的所有子项,其中一个是我们正在寻找的合并and branch(DESTINATION)
过滤p2()
的子项,只显示目标分支上的变更集,这恰好是我们正在寻找的合并。因此,要将 last 从源合并到目标,请使用max(set)
查询包装上述查询。所以最后的命令是:
max(children(p2(::DESTINATION and merge()) and branch(SOURCE)) and branch(DESTINATION))
答案 6 :(得分:0)
hg log -r "last(ancestors(target) & branch(source))"
这为您提供目标和源分支 ON 源分支的最不常见的祖先。
source o---a---o---m2---o
\ /
intermediate o--o--m1---b---o
\
target o---o------------m3---o
此示例中源和目标分支的最不常见的祖先是 b ,但 b 不在源分支上,因此我们希望获得一个回来。
要获得 b ,您可以使用Lasse的解决方案:
hg log -r "ancestor(source, target)"
我经常想知道最新的&#34;默认&#34;在某个任务分支中进行修订,如果我的任务分支直接与默认分支或通过某个中间路径合并,我就不在乎。