2011-03-31 65 views
31

在某個時間點,您有一個名爲branch的mercurial,我們稱它爲default,然後從default創建一個命名分支,讓我們稱它爲foo,然後在foo上進行一些提交。這種工作看起來像這樣:如何找到命名的mercurial分支的父級?

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的父分支的命令?

回答

48

感謝您的revset示例。我擺弄了一圈,發現這個解決方案,我有點像:

hg log -r "parents(min(branch(foo)))" 

將打印頭就FOO分公司提交的修訂是基於。您可以在該變更集中查找分支(或缺少指示默認分支),這是foo的父分支(至少在問題中定義父分支的方式)。

但我有這種嘮叨的感覺......父母()可能會返回多個變更集。一個分支上的第一次提交可以有兩個父母嗎?我想不出會發生什麼。

+1

是的,你可以偶爾有兩個父母。實現此目的的一種方法是執行合併,並將合併結果提交給新的命名分支。 TortoiseHg似乎禁止這一點,但你可以從CLI中完成。話雖如此,這次重啓並不是一個壞主意。 – dls 2011-04-01 03:25:59

+0

聖牛!我不知道你可以使用函數修訂... – 2011-06-30 01:05:46

+1

我把以下內容放在我的.hgrc [別名]部分:parent-branch =!出口REV = $ 1; export REV = $ {REV: - 。}; echo hg parent-branch $ {REV}; $ HG log -r「父母(min(branch($ {REV})))」 – 2013-01-30 23:39:14

4

假設您擁有Mercurial v1.7或更高版本,可以使用revset完成此操作。

hg log -r "ancestor(<changeset>, <changeset>)"

其中changeset可能是一個分支,標籤,版本ID或變更哈希值。

這將打印出兩個變更集的最大共同祖先。

如果沒有共同的祖先,那麼結果是空的。

+0

這比我的回答更簡潔,但我認爲它假設功能分支來自'默認' – dls 2011-03-31 20:31:25

+0

這是如何告訴我分支foo的父親?換句話說,問什麼:'hg log -r「祖先(???,foo)」' – krupan 2011-03-31 22:55:35

+0

@krupan:根據你原來的帖子,它聽起來像你知道哪個分支'foo'是(在你的例子中,它是'default'),所以你可以使用'ancestor(default,foo)',如果你不知道它從哪裏分支出來,那麼你應該試試@dls的答案 – 2011-04-01 00:25:32

7

如果您使用的是Mercurial v1.6.0或更高版本,則可以使用revsets查找此信息。例如:

hg update BRANCH 
hg log -r "max(ancestors(BRANCH) and not branch(BRANCH))" 

這將打印出一個修訂版本,即功能分支的「分支點」。

+0

有趣這似乎向我展示了最近一次合併到有問題分支的提交,這讓我想到了,你可以在不同的分支上合併到一個給定的分支(在本例中爲foo),如果你想知道哪個分支foo是由此創建的可能是錯誤的 – krupan 2011-03-31 23:05:01

+0

@krupan:是的,我相信這將是這種方法的一個缺點,您可以查看revset help'hg help revset',看看您是否可以想到另一種方式來獲得你想要的東西 – dls 2011-04-01 03:12:18

+0

如果你只想返回分支名稱(例如對於腳本):'hg id -br'max(祖先(BRANCH)而不是分支(BRANCH))'' – Blaise 2018-02-05 09:09:53

-1

我也工作了:對@ krupan的答案基於

hg log --only-branch $(hg branch) | tail -n 10 | grep parent 
1

我想出了以下內容:

hg log --rev "parents(min(branch(.)))" --template "{branch}\n" 

這將打印父分支的唯一名字。

  • --rev "revset expression"使用revset表達式指定revset
  • branch()選擇指定分支的所有修訂版。
  • min()選擇指定修訂範圍的第一個修訂版。
  • parents()選擇指定修訂範圍的父母。
  • .指示當前修訂。或者,您可以指定任何修訂名稱。
  • --template "{branch}\n"指定一個只打印分支名稱的自定義模板。