Mercurial “显示”;默认路径";?

Mercurial “显示”;默认路径";?,mercurial,Mercurial,我可以通过以下方式查看命名分支何时合并到default: 但这显示了如下内容: 836230f2cbc3 (b21341) was merged on Tue Mar 28 09:51:28 2017 -0700 -- terrible terrible merge 65a95167a306 (default) was merged on Tue Mar 28 09:30:06 2017 -0700 -- Merged b30695 into default 如果您阅读了这些精彩的提交消息,您

我可以通过以下方式查看命名分支何时合并到
default

但这显示了如下内容:

836230f2cbc3 (b21341) was merged on Tue Mar 28 09:51:28 2017 -0700 -- terrible terrible merge
65a95167a306 (default) was merged on Tue Mar 28 09:30:06 2017 -0700 -- Merged b30695 into default
如果您阅读了这些精彩的提交消息,您会注意到第二条消息实际上是“Mergedb30695into default”,尽管我试图弄清楚
b21341
是如何进入默认状态的

因此,如果我试图找出
b21341
是如何被合并到
b30695
中的,我会得到另外两个变更集:

hg log -r "children(ancestor(b30695, b21341)) and merge()" --template "{node|short} ({branch}) was merged on {date|date} -- {desc}\n"  
2e082d1b45e9 (b27369) was merged on Mon Mar 27 09:49:22 2017 -0700 -- merged in stable
73752628d887 (b29454) was merged on Mon Mar 27 11:28:41 2017 -0700 -- merge stable
等等

我想了解的是
b21341
是如何合并到默认值中的。i、 例如,它应该显示它合并到的所有不同命名分支的路径,直到它进入
default

有这样的查询吗


我是这样想的

hg log -G -r "b21341:default and merge()" -T "{node|short} ({branch}) | {date|date} | {desc}"
但看起来不太对劲。我想查看
b21341
合并到的分支的名称,但前提是该分支最终合并到
default
。一旦合并到默认值中,图形也应该立即终止(上面的查询即将出现)


收益率:

但这并不完全正确

  • 它跟踪默认到现在——我希望它在分支进入默认状态时立即停止
  • 它没有给出b21341是如何陷入违约的清晰画面。在底部附近,我看到默认值被合并到b21341中,但我仍然看不到b21341在哪里被合并到其他内容中

  • 根据您的文本更新,听起来您希望“在DAG范围内进行合并,该范围从
    default
    b21341
    的合并基开始,一直到但不超过某些可能难以指定的节点。”(虽然您可能想要一个完全不同的起点,Mercurial可以提供给您,但Git不能。)

    任何基于提交图的操作都有一个问题。我们知道从哪里开始查看该图:它要么是“属于分支
    b21341
    ”的所有提交,要么是“属于分支
    default
    b21341
    的合并基”。因为Mercurial会记住任何给定提交是在哪个分支中进行的,所以我们可以区分这两种情况,我们可以对非常简单的情况进行说明,如下所示:

    ...--A--o--...--D--o--...--F--...--H  (default)
          \        /          /
           B--o---C--o--...--E--...--G    (b21341)
    
    这里是“有趣的”提交是
    A
    ,这是分支
    b21341
    default
    分叉的点;
    B
    ,这是
    b21341
    本身的第一次提交;
    C
    ,这是
    b21341
    default
    的共同祖先;
    D
    ,这是
    默认的合并提交引入了
    b21341
    E
    ,这是最后一个共同祖先;
    F
    ,这是另一个合并;
    G
    ,这是
    b21341
    中的头;
    H
    ,这是
    默认值
    中的头。(这假设每个命名分支中都有一个头部,情况并非如此,但如果我们有多个未命名的头部,就很难谈论它们!)

    在Mercurial中,我们总能找到所有这些有趣的提交。(我们不能在Git中使用它,因为它不记得在哪个分支上进行了提交:
    E
    最左边的所有内容都在两个分支上。Git有一个技巧可以帮助我们,即只遵循
    ——第一个父级
    ,但要使用它,您必须练习良好的合并规则,而不是每个人都这样做。)找到它们的表达式可能会变得冗长复杂,但总是可能的

    如果你想从提交
    E
    开始,这是你一直在使用的表达式:
    祖先(默认,b21341)
    。从
    B
    开始很容易,它是
    第一个(b21341)
    。查找
    C
    似乎有点困难(这是一组“向上”合并的提交中的第一个)朝向或进入
    default
    ,因此
    首先(某物)
    ,但指定该设置很难,或者至少很难),我不打算在这里尝试


    当然,在这种情况下,
    b21341
    不会直接合并到
    default
    中,而是通过一些中介。因此,我们有一组不同的“有趣的”提交,尽管我将保留以前的
    F
    H
    ,同时添加新的单个字母来表示新的有趣的提交:

    ...-----------------F--...-G-...-H  (default)
     .                 /      /
      .               E----...          (some branch)
       .             /
        .           D--...              (yet another branch)
         \         /
          B--...--C--...                (b21341)
    
    我认为您的“有趣”提交是从
    C
    开始的,它又是
    祖先(默认值为b21341)
    。为了压缩显示目的,我只绘制了向上的合并,然后返回到
    default
    ,但是在每个中间分支上可能有任意数量的非合并提交,即在
    D
    之前和
    e
    之前,我们希望跳过。还可能有其他合并,例如
    G
    我们还希望跳过,因为它们不在从
    C
    直接向上的路径上:也就是说,我们要做的是在点击
    default
    上的合并并且是
    C
    的后代时停止:

    first(descendants(ancestor(default, b21341)) and merge() and branch(default))
    
    所以我认为这里的revset表达式有点可怕:-):

    选择了一个或多个提交节点后,我们就可以通过模板显示它们了。我不确定是否有更有效的方法来实现这一点:

    '{node|short} ({revset(p2node) % "{node|short} {branch}"} => {branch}) {desc}'
    
    但是,如果我们选择commit
    F
    并希望查看
    E
    的节点ID,以及
    E
    的分支名称开启了哪个分支commit
    E
    F
    在本例中当然是开启的
    default

    如果在“
    C
    F
    之间”有额外的合并,例如,如果两个中间分支多次合并,您将选择所有这些分支。如果不编写实际的Python代码,这是很难避免的。不过,这里的模板应该很好地识别它们

    把这些都放在一起,然后把长队分开:

    hg log -G -r '(ancestor(default, b21341) :: \
        first(descendants(ancestor(default, b21341)) and \
           merge() and branch(default))) and merge()' -T \
        '{node|short} ({revset(p2node) % "{node|short} {branch}"} => {branch}) {desc}'
    
    当然,我没有测试过,因为我没有您的存储库。

    main pro
    (ancestor(default, b21341)::first(descendants(ancestor(default, b21341)) and merge() and branch(default))) and merge()
    
    '{node|short} ({revset(p2node) % "{node|short} {branch}"} => {branch}) {desc}'
    
    hg log -G -r '(ancestor(default, b21341) :: \
        first(descendants(ancestor(default, b21341)) and \
           merge() and branch(default))) and merge()' -T \
        '{node|short} ({revset(p2node) % "{node|short} {branch}"} => {branch}) {desc}'