2010-02-10 76 views
233

我已經完成了一個功能分支feature-x的工作。我想將結果合併回default分支,並關閉feature-x,以便在hg branches的輸出中清除它。如何正確關閉Mercurial中的功能分支?

我想出了下面的情況,但仍存在一些問題:

$ hg up default 
$ hg merge feature-x 
$ hg ci -m merge 
$ hg up feature-x 
$ hg ci -m 'Closed branch feature-x' --close-branch 

所以feature-x分支(changests 40 - 41)是封閉的,但有一個新的頭,收盤分支變更44,將在hg heads每次列出:

$ hg log ... 
o 44 Closed branch feature-x 
| 
| @ 43 merge 
|/| 
| o 42 Changeset C 
| | 
o | 41 Changeset 2 
| | 
o | 40 Changeset 1 
|/ 
o 39 Changeset B 
| 
o 38 Changeset A 
| 

更新:從1.5版開始,Mercurial似乎不再在hg heads的輸出中顯示封閉分支的頭部。

是否可以關閉合並分支而不留下多一個頭?是否有更正確的方法來關閉功能分支?

相關問題:

+0

@Andrey:但文章指出不只是談論「 - 關閉分支」。它顯示*四種方法來修剪你的分支。如果你真的不再需要它,可以按照文章中的解釋克隆。唯一的「問題」是,如果出於任何原因你想關閉它,但要保持它。 – SyntaxT3rr0r 2010-02-10 17:52:24

+1

@WizardOfOdds是的,我讀過修剪枯枝的整篇文章。我希望分支留在修訂歷史記錄中,而不是扔掉它。以前我只是將功能分支合併到'default'中,而不是「關閉」它們。它導致了0個新的頭,但這樣的分支永遠可見於'hg branches'(作爲非活動分支)。 – 2010-02-10 18:02:51

+0

要開發功能,我傾向於克隆整個存儲庫,然後在功能完成後將其合併回來。我不喜歡在歷史上留下(封閉)分支的遺體。 – DanMan 2014-03-28 21:38:15

回答

211

一種方法是隻留下合併特性分支打開(和無效):

$ hg up default 
$ hg merge feature-x 
$ hg ci -m merge 

$ hg heads 
    (1 head) 

$ hg branches 
default 43:... 
feature-x 41:... 
    (2 branches) 

$ hg branches -a 
default 43:... 
    (1 branch) 

另一種方法是關閉功能分支使用額外的合併前承諾:

$ hg up feature-x 
$ hg ci -m 'Closed branch feature-x' --close-branch 
$ hg up default 
$ hg merge feature-x 
$ hg ci -m merge 

$ hg heads 
    (1 head) 

$ hg branches 
default 43:... 
    (1 branch) 

第一個是簡單的,但它留下一個開放的分支。第二個不留下開放的頭部/分支,但它需要一個輔助提交。可以使用--close-branch將最後一次實際提交到功能分支與此額外提交結合使用,但應提前知道哪個提交將是最後一次提交。

更新:由於水銀1.5,你可以隨時關閉分支,所以它不會出現在兩個hg brancheshg heads了。唯一可能會讓你煩惱的是,從技術上來說,修訂圖還是會有一個沒有童裝的版本。

更新2:由於Mercurial 1.8 書籤已成爲Mercurial的核心功能。書籤比分支命名更便於分支。也看到這個問題:

+1

「書籤比分支命名更方便」。 Hg書籤與Git分支不同。它們充滿了許多邊緣情況,這使得它們不適合作爲特徵分支。例如:當你克隆一個版本庫時,你將會在'default'分支中得到最新的提交。如果您使用書籤,則此更改集對應於隨機(不穩定)書籤。如果您使用命名分支,您將在穩定/默認分支中獲得最新提交,這通常是您想要的。書籤將在一天內到達,但他們還沒有到達那裏。 – Gili 2014-10-08 03:25:23

+0

我使用書籤作爲只在我的本地存儲庫中可見的私有標籤。它們充當我需要重新訪問的變更集的提醒。 – Gili 2014-10-08 03:26:26

+0

我試圖按照這種方法,但嘗試推送時仍然出現錯誤:'abort:push會創建新的遠程分支:'。我可以做錯什麼? – kasperd 2015-11-16 10:48:11

11

編輯哎喲,來不及了......我知道讀您的評論指出,要保持功能-X變更左右,所以克隆方法在這裏不起作用。

我仍然會讓這裏的答案可以幫助別人。

如果你想完全擺脫「功能X」,因爲,例如,它不起作用,你可以克隆。這是文章中解釋的方法之一,它確實有用,它專門討論頭部問題。

據我知道你有這個,想擺脫「功能-X」頭一勞永逸:

@ changeset: 7:00a7f69c8335 
|\ tag:   tip 
| | parent:  4:31b6f976956b 
| | parent:  2:0a834fa43688 
| | summary:  merge 
| | 
| | o changeset: 5:013a3e954cfd 
| |/ summary:  Closed branch feature-x 
| | 
| o changeset: 4:31b6f976956b 
| | summary:  Changeset2 
| | 
| o changeset: 3:5cb34be9e777 
| | parent:  1:1cc843e7f4b5 
| | summary:  Changeset 1 
| | 
o | changeset: 2:0a834fa43688 
|/ summary:  Changeset C 
| 
o changeset: 1:1cc843e7f4b5 
| summary:  Changeset B 
| 
o changeset: 0:a9afb25eaede 
    summary:  Changeset A 

所以,你這樣做:

hg clone . ../cleanedrepo --rev 7 

而且您將有以下內容,你會看到該功能-X的確是走了:

@ changeset: 5:00a7f69c8335 
|\ tag:   tip 
| | parent:  4:31b6f976956b 
| | parent:  2:0a834fa43688 
| | summary:  merge 
| | 
| o changeset: 4:31b6f976956b 
| | summary:  Changeset2 
| | 
| o changeset: 3:5cb34be9e777 
| | parent:  1:1cc843e7f4b5 
| | summary:  Changeset 1 
| | 
o | changeset: 2:0a834fa43688 
|/ summary:  Changeset C 
| 
o changeset: 1:1cc843e7f4b5 
| summary:  Changeset B 
| 
o changeset: 0:a9afb25eaede 
    summary:  Changeset A 

我可能誤解了你想要的,但請不要國防部下來,我花時間複製你的使用情況:)

+0

是的,我不想刪除歷史記錄。不管怎樣,謝謝。 – 2010-02-10 18:21:59

76

恕我直言,有兩種情況對於已經忘了關

案例分行: 分公司在此合併到默認

情況我更新到分支,並做了--close-branch的另一個提交,不幸的是,這選擇分支成爲新的提示,因此在推到其他克隆之前,我確保真正的提示會收到一些更改,而其他人不會對這個奇怪的提示感到困惑。

hg up myBranch 
hg commit --close-branch 

案例2: 分公司合併到默認

這種情況是不是從案例1很大的不同,它可以通過再生步驟的情況下1和兩個額外的人來解決。

在這種情況下,我更新到分支變更集,使用--close-branch做另一個提交,並將成爲提示的新變更集合併爲默認值。最後的操作會創建一個新的提示,它位於默認分支 - HOORAY!

hg up myBranch 
hg commit --close-branch 
hg up default 
hg merge myBranch 

希望這有助於未來的讀者。

+3

像我這樣的Mercurial新手很好的答案。並且感謝您不使用「ci」,它沒有被hg help列爲命令之一,所以我不知道它是什麼意思:) – 2012-08-07 16:56:04

+7

@MB .:在這種情況下,'hg help ci'會解釋它給你。 – 2013-05-27 11:53:09

6

令人奇怪的是,竟然沒有一個尚未曾建議關閉功能分支的最可靠的方法... 你可以只結合合併與--close分支標誌提交(即提交修改後的文件,並關閉分支同時):

hg up feature-x 
hg merge default 
hg ci -m "Merge feature-x and close branch" --close-branch 
hg branch default -f 

就這樣。沒有一個額外的頭在審判。沒有額外的提交。

+0

我在我的回答中提到過:「」「可以使用--close-branch將最後一次實際提交到功能分支與此額外提交結合起來,但應該事先知道哪個提交將是最後一次提交。」 「」 – 2015-03-07 18:06:55

+0

好吧,我明白了。我只是不太明白句子的最後部分(「但是人們應該知道......」),所以我認爲這意味着不同。另外我想指出的是,這種方法不被大多數GUI工具(TortoiseHG,SourceTree等)支持。 – tav 2015-03-08 13:00:48

+0

@AndreyVlasovskikh這個答案的要點是關閉合並中的分支,而不是在功能分支的最後一次提交中。 – kasperd 2015-11-10 09:03:28