我可以看到命名分支何时通过this command合并到default
:
hg log -r "children(ancestor(default, b21341)) and merge()" --template "{node|short} ({branch}) was merged on {date|date} -- {desc}\n"
但这显示如下:
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
如果您阅读了这些精彩的提交消息,您会注意到第二个实际上是"将 b30695 合并为默认值"即使我试图找出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
等等。
我想要的是graph b21341
如何合并为默认值。也就是说,它应该显示它所合并的所有不同命名分支的路径,直到它进入default
。
是否有查询会这样做?
我在想这样的事情
hg log -G -r "b21341:default and merge()" -T "{node|short} ({branch}) | {date|date} | {desc}"
但它看起来并不合适。我希望看到b21341
合并到的分支的名称,但仅当该分支最终合并到default
时。一旦合并到默认值(上面的查询将要出现),图表也应该终止
$ hg log -G -r "descendants(ancestor(default, b21341)) and merge()" -T "{revset('p2(%d)', rev) % '{node|short} ({branch})'} => {node|short} ({branch}) | {date|date} | {desc|strip|firstline|strip}\n"
o c461c6d7e725 (default) => f30e9413ff25 (default) | Tue Apr 04 12:17:20 2017 -0700 | merge
|\
| o 87e6f6864404 (default) => 682511875e7d (default) | Tue Apr 04 09:07:52 2017 -0700 | Automated merge
| |\
| | o 45ad99aabab6 (default) => a58e849eb198 (default) | Tue Apr 04 08:55:12 2017 -0700 | rpt-14
| |/
| o 36414f2bcbc2 (default) => a2c949bf13fc (default) | Mon Apr 03 20:49:27 2017 -0700 | merge
| |
| o 119a1960a61d (default) => 47fb25095be8 (default) | Mon Apr 03 20:34:25 2017 -0700 | merge
| |
| o 9c0a22b21d09 (default) => 84208df5a215 (default) | Mon Apr 03 20:17:39 2017 -0700 | merge
| |\
| o | a9a51ef9230d (default) => 857ba78f4fdf (default) | Mon Apr 03 19:59:38 2017 -0700 | Automated merge
| |/
| o c62e4f3565f6 (default) => f91b349e50b8 (default) | Mon Apr 03 19:39:37 2017 -0700 | Automated merge
| |\
| o | ab9848c00bbc (default) => c62e4f3565f6 (default) | Mon Apr 03 19:07:48 2017 -0700 | fetch fixees. merged in
| |/
| o 714b6a6f826a (default) => 4a3e91baa604 (default) | Mon Apr 03 16:59:49 2017 -0700 | merge
| |\
| o | c201b33f3ef5 (default) => 714b6a6f826a (default) | Mon Apr 03 16:27:37 2017 -0700 | ->Fetch updates
| |/
| o 4d0584f3722b (default) => 48e3df894646 (default) | Mon Apr 03 14:14:40 2017 -0700 | Automated merge
| |
| o cc26a1fe435a (default) => 75eab9550876 (default) | Fri Mar 31 16:29:14 2017 -0700 | merge
| |
| o 2010d6c42271 (default) => 360677ad2709 (default) | Fri Mar 31 13:47:14 2017 -0700 | Mergey merge
| |
| o c3013d9c21b0 (default) => d5f420767672 (default) | Fri Mar 31 12:42:27 2017 -0700 | Automated merge
| |\
| o | d5fb7882ded8 (default) => c3013d9c21b0 (default) | Fri Mar 31 12:35:50 2017 -0700 | merge
| |/
| o f6333f8b1927 (default) => 0ff996beb803 (default) | Fri Mar 31 11:07:56 2017 -0700 | Automated merge
| |
| o 12d521d98f45 (b28197) => 0aab8dd2b4c2 (default) | Thu Mar 30 14:36:29 2017 -0700 | Merged b28197 into default
| |\
| o \ 8cc3cfdf55d1 (b30630) => 35f0a6f2c4f6 (default) | Thu Mar 30 14:36:26 2017 -0700 | Merged b30630 into default
| |\ \
| o \ \ c2b23ec72ff3 (b27477) => 5b6367131b36 (default) | Thu Mar 30 14:36:23 2017 -0700 | Merged b27477 into default
| |\ \ \
| | o \ \ 95c0db6914cd (b28675) => bb46978c48c4 (default) | Thu Mar 30 14:32:09 2017 -0700 | Merged b28675 into default
| | |\ \ \
| | o \ \ \ 866073c5de8e (b28336) => 80b486aaf058 (default) | Thu Mar 30 14:32:06 2017 -0700 | Merged b28336 into default
| | |\ \ \ \
| | o \ \ \ \ fcc5c3791172 (b30353) => 605a51c52f65 (default) | Thu Mar 30 14:30:28 2017 -0700 | Merged b30353 into default
| | |\ \ \ \ \
+---o | | | | | 1446674834b8 (b30774) => e2aed3cc1b97 (default) | Thu Mar 30 14:30:25 2017 -0700 | Merged b30774 into default
| | | | | | | |
+---o | | | | | 32a22fb906b1 (b28867) => 6b4824d7c988 (default) | Thu Mar 30 14:30:22 2017 -0700 | Merged b28867 into default
| | | | | | | |
o | | | | | | | d3fbf05d250f (b30590) => 8b52881b125f (default) | Tue Mar 28 16:28:06 2017 -0700 | Merged b30590 into default
|\ \ \ \ \ \ \ \
o \ \ \ \ \ \ \ \ bade429fce2f (b30287) => f5a0585d38ac (default) | Tue Mar 28 15:25:47 2017 -0700 | Merged b30287 into default
|\ \ \ \ \ \ \ \ \
o \ \ \ \ \ \ \ \ \ 65a95167a306 (default) => 784f90350d9f (default) | Tue Mar 28 10:39:38 2017 -0700 | Merged namespace fix
|\ \ \ \ \ \ \ \ \ \
+-------o | | | | | | 65a95167a306 (default) => c2b23ec72ff3 (b27477) | Tue Mar 28 10:36:48 2017 -0700 | Merged in default
| | | | | | | | | | |
o | | | | | | | | | | 2fa39946baa0 (b30695) => 65a95167a306 (default) | Tue Mar 28 09:30:06 2017 -0700 | Merged b30695 into default
|\ \ \ \ \ \ \ \ \ \ \
+-----------------------o 766f032973cf (default) => 836230f2cbc3 (b21341) | Tue Mar 28 09:51:28 2017 -0700 | terrible terrible merge
| | | | | | | | | | | | |
o | | | | | | | | | | | | c1bbe7368498 (default) => 766f032973cf (default) | Tue Mar 28 09:22:44 2017 -0700 | moving stable merginess
|\ \ \ \ \ \ \ \ \ \ \ \ \
但这并不是对的。
答案 0 :(得分:1)
根据您的文字更新,它听起来像您想要"合并在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
,default
上的合并提交,带来b21341
; E
,这是最后共同祖先; F
,这是另一个合并; G
,b21341
中的头; H
;和default
,E
中的头部。 (这假定在每个命名分支中都有一个头部,但情况不一定如此,但如果我们有多个未命名的头部,则很难谈论它们!)
在Mercurial中,我们总能找到所有这些有趣的提交。 (我们不能在Git中,它不记得提交提交的分支:--first-parent
左边的所有内容都在两个分支上.Git有一个技巧可以帮助,即仅使用E
,但要使用它,你必须练习良好的合并规则,这并非每个人都这样做。)找到它们的表达方式可能会变得冗长而复杂,但它总是可能
如果您想从提交ancestor(default, b21341)
开始,那么它就是您一直使用的表达式:B
。从first(b21341)
开始很容易,它是C
。查找default
似乎有点困难(它是一组提交中的第一个提交合并"向上"朝向或进入first(something)
,所以b21341
,但是指定 设置很难,或者至少是难以理解的),我不打算在这里尝试。
在这种情况下,当然,default
不会将直接合并到F
中,而是通过某些中介或中介。因此,我们有一个不同的"有趣的"虽然我将保留H
和...-----------------F--...-G-...-H (default)
. / /
. E----... (some branch)
. /
. D--... (yet another branch)
\ /
B--...--C--... (b21341)
,但添加新的单个字母表示新的有趣提交:
C
我认为你的"有趣的"提交以ancestor(default, b21341)
开头,再次只是default
。出于压缩显示的目的,我只绘制了向上导回到D
的向上合并,但是在每个中间分支上可能存在任意数量的非合并提交,即在E
之前和在我们希望跳过的G
之前。我们也希望跳过的其他合并,例如C
,因为它们不在default
的直接路径上:即我们想要的当我们点击位于C
上的合并且是first(descendants(ancestor(default, b21341)) and merge() and branch(default))
的后代时停止:
(ancestor(default, b21341)::first(descendants(ancestor(default, b21341)) and merge() and branch(default))) and merge()
所以我觉得这里的revset表达式有点可怕:-):
'{node|short} ({revset(p2node) % "{node|short} {branch}"} => {branch}) {desc}'
选择了我们的提交节点或节点后,我们可以显示它们/但是我们喜欢使用模板。我不确定是否有更有效的方法:
F
但是,如果我们选择提交E
并希望查看E
的节点ID以及E
分支提交F
,那么我们想要的是什么{1}}的分支名称(default
当然是C
)。
如果有其他合并"在"之间F
和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}'
,例如,如果两个中间分支彼此合并多次,您将选择所有这些分支。没有编写实际的Python代码就很难避免。不过,这里的模板应该很好地识别它们。
将这些全部放在一起并分解长队:
{{1}}
当然我没有测试过,因为我没有您的存储库。