2009-09-10 81 views
46

最近我從SVN切換到Mercurial。現在我想知道如何根據良好的實踐來實現Mercurial中我想要的分支工作流程,希望其他開發人員瞭解存儲庫中會發生什麼。在Mercurial中管理髮布分支

這是工作流程:

  1. 平時我有一個主幹/ default分支,其中對當前版本一系列的工作情況。假設這是1.x.同時,我使用分支2.x來開發下一個主要版本。這個分支的變化可能是激進的,所以與trunk/default/1.x分支合併在這裏沒有意義。
    • 經過一段時間2.x的工作可能會完成,版本2.0獲得釋放。現在我希望2.x分支成爲新的默認/中繼分支,並且當前的默認/中繼是1.x分支。
    • 重複這個過程,可能會出現一個新的3.x分支。和以前一樣,如果3.0被釋放,3.x應該成爲新的默認分支,而當時的默認值應該變成2.x分支(再次)。

我的問題是這個工作流程是否是一個很好的(我想這不是根本上的錯誤)。我的問題是,我在Mercurial中意識到這一點的方式是否可以被視爲良好的做法,或者是否有更好的機會。

因此,這裏是我計劃在水銀來管理分行...

從一個分支庫保持當前版本的1.x系列的代碼開始:

$ hg init 
$ echo "hello world" > file1.txt 
$ hg ci -A -m "Initial commit of 1.x code" 

開始在2.x版的工作:

$ hg branch 2.x 
$ hg ci -m "Create new branch for 2.x development" 
$ echo "Big new feature for 2.x" > file2.txt 
$ hg ci -A -m "Add big new feature" 

同時,做一些工作在當前版本系列(1.x中):

$ hg up default 
$ echo "Minor adjustments specific for 1.x" > file3.txt 
$ hg ci -A -m "Minor adjustments" 

經過一段時間發佈2.0版準備就緒後,yippee!讓默認分支1.x的2.X默認

$ hg up default 
$ hg branch 1.x 
$ hg ci -m "Make default branch to 1.x branch" 
$ hg up 2.x 
$ hg ci --close-branch -m "Close branch 2.x" 
$ hg branch --force default 
$ hg ci -m "Make former 2.x branch to new default" 

現在創建一個新的分支3.X和它的工作,還對默認工作。同樣,一段時間後,3.0已經準備好,它的時間再次來管理分支名稱:

$ hg up default 
$ hg branch --force 2.x # (reuse previously closed 2.x branch name) 
$ hg ci -m "Make default branch to 2.x branch" 
$ hg up 3.x 
$ hg ci --close-branch -m "Close branch 3.x" 
$ hg branch --force default 
$ hg ci -m "Make former 3.x branch to new default" 

現在的回購可能是這樣的(「O」是頭):

o Branch default (3.x) 
| 
| o Branch 2.x 
\| 
    | o Branch 1.x 
    \| 
    | 
    . 

要點我不確定如果重複使用分支名稱和與分支名稱雜耍默認是很好的做法。

很多關於該問題的文字 - 對不起 - 但我想清楚我在做什麼。

+0

[Mercurial wiki](http://www.mercurial-scm.org/wiki/StandardBranching)對此主題進行了很好的介紹。 – xyres 2016-02-22 16:40:14

回答

47

這裏就是我想要做的:

default你的 「主線」 分支。這個分支的提示是「當前向公衆發佈」版本的代碼。關鍵錯誤修正可以直接提交給該分支併合併到開發分支中。

要開始使用2.0版,請創建2.0-dev分支。將2.0的更改提交到該分支,並將主線(default)中的關鍵錯誤修正合併到該分支中。完成2.0後,將2.0-dev合併到default中,並將結果標記爲2.0

以這種方式做事意味着您不必擔心雜耍分支名稱,並且可以很容易地將關鍵錯誤修正合併到主線中。

當你一次處理多個未來版本(比如2.1和3.0)時,它也可以很好地擴展。您可以定期將2.1更改合併到3.0中以保持3.0最新。

你會用這樣的圖形結束了:

$ hg glog -l 1000 
@  changeset: 25:efc0096f47c0 tip 
|  summary: Added tag 3.0 for changeset d1a7fc3d7d77 
| 
o  changeset: 24:d1a7fc3d7d77 3.0 
|\  summary: Merge in the redesign changes. 
| | 
| o  changeset: 23:b5b69d24c8f7 3.0-dev 
| |  summary: Finish 3.0 redesign. 
| | 
| o  changeset: 22:4c2f98fac54b 3.0-dev 
|/|  summary: Merge in the latest changes to 2.1/mainline. 
| | 
o |  changeset: 21:37df04521032 
| |  summary: Added tag 2.1 for changeset 39ecc520fc0a 
| | 
o |  changeset: 20:39ecc520fc0a 2.1 
|\ \ summary: 2.1 development is done. 
| | | 
| o | changeset: 19:208f3f9236af 2.1-dev 
| | | summary: Finish the 2.1 work. 
| | | 
| | o changeset: 18:4a024009a9d6 3.0-dev 
| | | summary: More redesign work. 
| | | 
| | o changeset: 17:00c416888c25 3.0-dev 
| |/| summary: Merge in changes from the 2.1 branch to keep the redesign current. 
| | | 
| o | changeset: 16:a57e781a0db1 2.1-dev 
| | | summary: More 2.1 work. 
| | | 
| | o changeset: 15:ddeb65402a61 3.0-dev 
| | | summary: More redesign work. 
| | | 
+---o changeset: 14:90f5d7a8af9a 3.0-dev 
| | | summary: Merge in the fire fixes. 
| | | 
| o | changeset: 13:78a949b67bb9 2.1-dev 
|/| | summary: Merge in the fire fixes. 
| | | 
o | | changeset: 12:6dfe9d856202 
| | | summary: Oh no everything is on fire, fix it in the mainline. 
| | | 
| o | changeset: 11:86767671dcdb 2.1-dev 
| | | summary: Smaller changes for 2.1. 
| | | 
| | o changeset: 10:25dec81d2546 3.0-dev 
| | | summary: Work more on the redesign. 
| | | 
+---o changeset: 9:42c7d689fb24 3.0-dev 
| |  summary: Start working on a complete redesign. 
| | 
| o  changeset: 8:3da99186ca7d 2.1-dev 
|/  summary: Start working on 2.1. 
| 
o  changeset: 7:9ba79361827d 
|  summary: Added tag 2.0 for changeset 755ed5c5e291 
| 
o  changeset: 6:755ed5c5e291 2.0 
|\  summary: Merge in the dev branch for 2.0. 
| | 
| o  changeset: 5:44a833fcc838 2.0-dev 
| |  summary: Finish work on 2.0. 
| | 
| o  changeset: 4:d7ba6aae1651 2.0-dev 
|/|  summary: Merge in the critical fix. 
| | 
o |  changeset: 3:968049f1b33a 
| |  summary: Fix a critical bug on the main branch. 
| | 
| o  changeset: 2:917869609b25 2.0-dev 
| |  summary: More work on the new version. 
| | 
| o  changeset: 1:f95798b9cb2e 2.0-dev 
|/  summary: Start working on version 2.0. 
| 
o  changeset: 0:8a3fb044d3f4 
     summary: Initial commit. 
+2

我聽說這個工作流程是建議的,但我不確定它應用得有多好,如果主線有幾個變化對於devel分支沒有意義。我想這歸結於我如何將最新的主線更改合併到devel分支中。我如何處理來自主線的不需要的更改?是否可以表達「從主線合併變更集23和27,但忽略所有其他變更集(或合併後撤消)」? – 2009-09-10 22:08:16

+4

如果你想合併23和27,並忽略其他,你需要移植擴展:http://mercurial.selenic.com/wiki/TransplantExtension如果你想合併一切和撤消23和27,你會正常合併,然後'hg backout 23 --merge; hg backout 27 --merge',同時在開發分支。 – 2009-09-10 23:45:59

+2

我認爲''backout'命令最適合我的用途。我測試過它,它做我想做的事。如果只有一些退出的變化,它似乎表現良好。否則,有很多不必要的更改,它會膨脹歷史圖表,意味着很多手動工作..但只要不是這種情況,我完全滿意你的建議:)謝謝! – 2009-09-11 10:21:15

2

我想你應該考慮這個問題:a successfull git branching model

我不是git的忠實粉絲,但是這個模型對於mercurial來說也是非常有用的。