在Mercurial中管理发布分支

Obe*_*nne 46 mercurial branch

最近我从SVN切换到了Mercurial.现在我想知道如何根据良好实践在Mercurial中实现我想要的分支工作流程,希望其他开发人员了解存储库中会发生什么.

这是工作流程:

  1. 通常我有一个trunk/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中实现这一点的方式是否可以被视为良好实践或是否有更好的机会.

所以这就是我计划在Mercurial中管理分支的方式......

从具有单个分支的存储库开始,该分支包含当前版本系列1.x的代码:

$ hg init
$ echo "hello world" > file1.txt
$ hg ci -A -m "Initial commit of 1.x code"
Run Code Online (Sandbox Code Playgroud)

开始处理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"
Run Code Online (Sandbox Code Playgroud)

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

$ hg up default
$ echo "Minor adjustments specific for 1.x" > file3.txt
$ hg ci -A -m "Minor adjustments"
Run Code Online (Sandbox Code Playgroud)

经过一段时间发布2.0准备好了,yippee!将默认分支设置为1.x2.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"
Run Code Online (Sandbox Code Playgroud)

现在创建一个新的分支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"
Run Code Online (Sandbox Code Playgroud)

回购现在可能看起来像这样('o'是头):

o Branch default (3.x)
|
| o Branch 2.x
 \|
  | o Branch 1.x
   \|
    |
    .
Run Code Online (Sandbox Code Playgroud)

我不确定的要点是,重用分支名称和使用分支名称默认是好的做法.

这个问题有很多文字 - 对不起 - 但我想清楚我正在做什么.

Ste*_*osh 47

这是我要做的:

建立default"主线"分支.此分支的提示是代码的"当前发布的公共"版本.关键错误修正可以直接提交到此分支并合并到开发分支中.

要开始使用2.0版,请创建一个2.0-dev分支.将2.0的更改提交到该分支,并将主线(default)中的关键错误修正合并到其中.一旦你有2.0完成,合并2.0-devdefault并标记的结果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.
Run Code Online (Sandbox Code Playgroud)

  • 我很高兴它有所帮助.如果你想要一个更加面向Mercurial的DVCS分支指南,你可能会喜欢我写的这篇文章:http://stevelosh.com/blog/entry/2009/8/30/a-guide-to-branching-in-mercurial / (5认同)
  • 如果你想合并23和27并忽略其他的,你需要移植扩展:http://mercurial.selenic.com/wiki/TransplantExtension如果你想合并所有内容并撤消23和27你将正常合并然后` hg backout 23 --merge; hg在开发分支上退出27 --merge`. (4认同)
  • 我听说这个工作流程是推荐的工作流程,但我不确定如果主线中有一些对于devel分支没有意义的更改,它的适用性如何.我想这归结为我如何将最新的主线变化合并到devel分支中.如何处理主线上不需要的更改?是否有可能表达类似"从主线合并变更集23和27但忽略所有其他变更集(或合并后撤消它们)"? (2认同)
  • 我认为`backout`命令最符合我的目的.我测试了它,它做了我想做的事情.当退出只有几个变化时,它似乎表现良好.否则,有很多不必要的变化,它会膨胀历史图表,并意味着很多手动工作..但只要不是这种情况我很满意你的建议:)谢谢! (2认同)