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
。一旦合并到默认值中,图形也应该立即终止(上面的查询即将出现)
收益率: 但这并不完全正确
根据您的文本更新,听起来您希望“在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}'
但是,如果我们选择commitF
并希望查看E
的节点ID,以及E
的分支名称开启了哪个分支commitE
(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}'