找到两个分支的最新合并点

时间:2011-11-09 15:16:07

标签: mercurial branching-and-merging

有两个分支,我如何找到两个分支合并的最新版本?是否有标准的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

7 个答案:

答案 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)

您可以将此查询重写为:

  • 最接近的单个变更集,它是两个分支的尖端的祖先变更集

假设您有两个由R1R2标识的分支,可以是分支的名称,也可以是每个变量集的修订号或哈希值,或者诸如此类的东西。

然后您可以找到您正在寻找的变更集:

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;在某个任务分支中进行修订,如果我的任务分支直接与默认分支或通过某个中间路径合并,我就不在乎。