在某个时间点你有一个mercurial命名分支,让我们调用它,默认,你从默认创建一个命名分支,让我们调用它,foo,你在foo上做一些提交。那种工作看起来像这样:
hg update default
hg branch foo
hg commit -m "created branch foo"
# work, work
hg commit
# work work
hg commit
与此同时,其他人正在默认提交。现在有人被告知要对foo做一些工作,他们想看看是否以及可能需要从foo的父分支合并的内容。如果他们知道foo来自默认,他们就可以运行:
hg merge --preview default
但是他们不知道foo来自哪里。他们可以跑:
hg glog
或者启动tortoisehg并将该行追溯到foo的父级,但是他们可以运行一个命令来告诉他们foo的父分支吗?
答案 0 :(得分:52)
感谢revset示例。我摆弄了一下,找到了我喜欢的解决方案:
hg log -r "parents(min(branch(foo)))"
将打印foo分支上第一次提交的修订版本。您可以在该变更集中查找分支(或缺少指示默认分支的分支),这是foo的父分支(至少在问题中定义了父分支的方式)。
但我有这种唠叨的感觉......父母()可以返回多个变更集。分支上的第一次提交是否有两个父母?我想不出那会怎么样。
答案 1 :(得分:8)
如果您使用的是Mercurial v1.6.0或更高版本,则可以使用revsets查找此信息。例如:
hg update BRANCH
hg log -r "max(ancestors(BRANCH) and not branch(BRANCH))"
这将打印出单个版本,即功能分支的“分支点”。
答案 2 :(得分:4)
假设你有Mercurial v1.7或更高版本,可以使用revset来完成。
hg log -r "ancestor(<changeset>, <changeset>)"
其中changeset
可以是分支,标记,修订版ID或变更集哈希。
这将打印出两个变更集的最大共同祖先。
如果没有共同的祖先,则结果为空。
答案 3 :(得分:2)
根据@ krupan的回答,我想出了以下内容:
hg log --rev "parents(min(branch(.)))" --template "{branch}\n"
这将仅打印父分支的名称。
--rev "revset expression"
使用revset表达式指定revset。branch()
选择指定分支的所有修订版。min()
选择指定修订范围的第一个修订版。parents()
选择指定修订范围的父级。.
表示当前版本。或者,您可以按名称指定任何修订。--template "{branch}\n"
指定仅打印分支名称的自定义模板。