【问题标题】:Managing release branches in Mercurial在 Mercurial 中管理发布分支
【发布时间】:2010-11-27 04:43:08
【问题描述】:

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

这是工作流程:

  1. 通常我有一个主干/默认分支,用于当前版本系列的工作。假设这是 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"

开始开发 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!使 default 分支到 1.x2.xdefault:

$ 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 并在其中工作,也可以在 default 上工作。同样,在 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"

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

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

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

这个问题有很多文字 - 抱歉 - 但我想清楚我在做什么。

【问题讨论】:

标签: mercurial branch


【解决方案1】:

这是我要做的:

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.

【讨论】:

  • 我听说这个工作流是推荐的,但我不确定如果主线中有几个对开发分支没有意义的更改,它的应用效果如何。我想这归结为我如何将最新的主线更改合并到开发分支中。如何处理来自主线的不需要的更改?是否可以表达类似“从主线合并变更集 23 和 27 但忽略所有其他变更集(或在合并后撤消它们)”之类的内容?
  • 如果你想合并 23 和 27 而忽略其他,你需要移植扩展:mercurial.selenic.com/wiki/TransplantExtension 如果你想合并所有内容并撤消 23 和 27,你会正常合并然后hg backout 23 --merge; hg backout 27 --merge在开发分支上。
  • 我认为backout 命令最适合我的目的。我已经测试过了,它做了我想做的事。当仅对退出进行一些更改时,它似乎表现良好。否则,有很多不需要的更改,它会使历史图表膨胀,并且意味着大量的手动工作..但只要不是这种情况,我对你的建议完全满意 :) 谢谢!
  • 哪种解决方案更好取决于您希望在开发分支中需要多少主线变更集。如果您希望 90% 在开发分支中并跳过 10%,那么退出是要走的路。如果您希望 10% 在 dev 分支中并跳过 90%,移植会更好。
  • 我很高兴它有帮助。如果您想要更多面向 Mercurial 的 DVCS 分支指南,您可能会喜欢我写的这篇文章:stevelosh.com/blog/entry/2009/8/30/…
【解决方案2】:

我认为您应该考虑这一点:a successfull git branching model

我不是 git 的忠实粉丝,但是这个模型对于 mercurial 也特别有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2012-07-03
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多