如何正确地关闭一个功能分支在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的输出中显示关闭分支的头。

是否有可能关闭一个合并的分支而不留下一个头?关闭一个特性分支有更正确的方法吗?

相关问题:

102538 次浏览

哎哟,太迟了……我知道你的评论说你想保留feature-x更改集,所以克隆方法在这里不起作用。

我还是把答案留在这里,因为它可能会帮助到其他人。

如果你想完全摆脱“功能X”,例如,因为它不起作用,你可以克隆。这是文章中解释的一种方法,它确实有效,它专门讨论了正面。

据我所知,你有这个,想要一劳永逸地摆脱“特征-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

我可能误解了你想要的东西,但请不要修改,我花了时间重现你的用例:)

一种方法是让合并的功能分支保持开放(和不活跃):

$ 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)

另一种方法是在合并之前使用额外的commit关闭一个特性分支:

$ 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 brancheshg heads中了。唯一可能让您烦恼的是,从技术上讲,修订图仍然会有一个没有子版本的修订。

更新2:自从Mercurial 1.8以来,书签已经成为Mercurial的核心功能。对于分支来说,书签比命名分支更方便。还有这个问题:

Imho,有两种情况的分支机构被忘记关闭

< p >案例1: 分支没有合并到default

在这种情况下,我更新到分支,并做另一个提交—关闭分支,不幸的是,这将选择分支成为新的提示,因此在将它推到其他克隆之前,我确保真正的提示接收更多的更改,其他人不会对那个奇怪的提示感到困惑。

hg up myBranch
hg commit --close-branch
< p >案例2: 分支被合并到default

这种情况与情况1没有太大的不同,它可以通过重现情况1和另外两个情况的步骤来解决。

在这种情况下,我更新到分支变更集,使用——close-branch再次提交,并将成为提示的新变更集合并为默认值。最后一个操作在默认分支中创建一个新的提示- HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

希望这对以后的读者有所帮助。

奇怪的是,还没有人提出关闭功能分支的最健壮的方法…… 你可以用——close-branch标记结合合并提交(即提交修改过的文件并同时关闭分支):

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

这就是全部内容。revgraph上没有多余的人头。没有额外的承诺。