如何正确关闭 Mercurial 中的功能分支?
题
我已经完成了功能分支的工作 feature-x
. 。我想将结果合并回 default
分支并关闭 feature-x
为了在输出中摆脱它 hg branches
.
我想出了以下场景,但它有一些问题:
$ 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
分支(变更 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
不再了。
是否可以关闭合并分支而不留下更多头?有没有更正确的方法来关闭功能分支?
相关问题:
解决方案
一种方法是让合并的功能分支保持打开状态(并且处于非活动状态):
$ 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
, ,但应该提前知道哪个提交将是最后一个。
更新:从 Mercurial 1.5 开始,您可以随时关闭分支,这样它就不会出现在两者中 hg branches
和 hg heads
不再了。唯一可能让您烦恼的是,从技术上讲,修订图仍将有一个没有子项的修订。
更新2:从 Mercurial 1.8 开始 书签 已成为 Mercurial 的核心功能。书签比命名分支更方便进行分支。另请参阅这个问题:
其他提示
恕我直言,有两种情况是分支机构忘记关闭
情况1:分支未合并到默认分支
在这种情况下,我更新到分支并使用 --close-branch 进行另一次提交,不幸的是,这会选择该分支成为新的提示,因此在将其推送到其他克隆之前,我确保真正的提示收到更多更改和其他更改不要对这个奇怪的提示感到困惑。
hg up myBranch
hg commit --close-branch
案例2:分支已合并到默认分支
这种情况与情况 1 没有太大区别,可以通过重复情况 1 和另外两个步骤的步骤来解决。
在这种情况下,我更新到分支变更集,使用 --close-branch 进行另一次提交,并将成为提示的新变更集合并到默认值中。最后一个操作在默认分支中创建了一个新提示 - 万岁!
hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch
希望这对未来的读者有所帮助。
编辑 哎呀,太晚了……我知道阅读您的评论,指出您希望保留 feature-x 变更集,因此这里的克隆方法不起作用。
我仍然会把答案放在这里,因为它可能会帮助其他人。
如果您想完全摆脱“功能 X”,例如因为它不起作用,您可以克隆。这是文章中解释的方法之一,它确实有效,而且它专门讨论了头部。
据我了解,您有这个并且想要一劳永逸地摆脱“feature-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
您将看到以下内容,并且您会看到 feature-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
我可能误解了您想要的内容,但请不要修改,我花了一些时间重现您的用例:)
奇怪的是,还没有人提出关闭功能分支的最可靠的方法......你可以只 结合 使用 --close-branch 标志合并提交(即提交修改的文件并同时关闭分支):
hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f
所以,仅此而已。转速表上没有一个额外的头。没有额外的承诺。