最近我从SVN切换到了Mercurial。现在我想知道如何根据良好实践在Mercurial中实现我想要的分支工作流程,希望其他开发人员了解存储库中会发生什么。
这是工作流程:
我的问题是不这个工作流程是否合适(我猜这不是根本错误的)。我的问题是,我在Mercurial中实现这一点的方式是否可以被视为良好实践,或者是否有更好的机会。
所以这就是我计划如何在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
\|
|
.
我不确定的主要观点是重复使用分支名称并且使用分支名称 default 进行操作是一种很好的做法。
该问题的大量文字 - 抱歉 - 但我想清楚我正在做什么。
答案 0 :(得分: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.
答案 1 :(得分:2)
我认为你应该考虑这个问题:a successfull git branching model。
我不是git的忠实粉丝,但这个模型对于mercurial来说也是非常有用的。