如何正确关闭Mercurial中的功能分支?


240

我已经完成了功能分支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分支(changests 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

是否可以关闭合并的分支而又不会留下另一个头呢?有没有更正确的方法来关闭功能分支?

相关问题:


@Andrey:但是这篇文章指出的不仅是“ --close-branch”。它显示了四种修剪分支的方法。如果您真的不想要它,可以按照本文中的说明进行克隆。唯一的“问题”是,无论出于何种原因,您都想关闭它,但仍要保留它。
语法T3rr0r 2010年

1
@WizardOfOdds是的,我已经阅读了整篇有关修剪死枝的文章。我希望分支保留在修订历史记录中,而不是丢弃它。以前,我只是将要素分支合并到其中,default而没有“关闭”它们。它产生了0个新的头,但是这样的分支hg branches永远可见(作为不活动的分支)。
Andrey Vlasovskikh 2010年

为了开发功能部件,我倾向于克隆整个存储库,然后在功能部件完成后将其合并回去。我不喜欢历史上(封闭的)分支的遗迹。
DanMan 2014年

Answers:


218

一种方法是仅使合并的功能分支保持打开状态(并且不活动):

$ 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,但是应该事先知道哪个提交将是最后一次。

更新:由于水银1.5,你可以随时关闭分支,所以它不会出现在两个hg brancheshg heads了。唯一可能使您烦恼的是,从技术上讲,修订图仍然会有一个没有子级的修订。

更新2:自Mercurial 1.8以来,书签已成为Mercurial的核心功能。书签比命名分支更方便分支。另请参阅以下问题:


2
不一定是真的Bookmarks are more convenient for branching than named branches。汞书签与Git分支不同。它们到处都是边缘情况,因此不适合作为要素分支。例如:克隆存储库时,您将在default分支中获得最新的提交。如果使用书签,则此变更集对应于随机(不稳定)书签。如果使用命名分支,则通常会在稳定/默认分支中获得最新的提交。书签将有一天到达那里,但还没有到那里。
吉利2014年

我将书签用作私有标签,这些私有标签仅在本地存储库中可见。它们提醒我需要重新访问的变更集。
吉利2014年

我尝试遵循这种方法,但是在尝试推送时仍然出现错误:abort: push creates new remote branches:。我做错了什么?
kasperd 2015年

79

恕我直言,有两种情况下分支机构被忘记关闭

情况1:分支未合并到默认值

在这种情况下,我更新到分支,并使用--close-branch进行另一次提交,不幸的是,这选择了分支成为新的提示,因此在将其推到其他克隆之前,我确保真实的提示收到了更多的更改以及其他提示不要对那个奇怪的技巧感到困惑。

hg up myBranch
hg commit --close-branch

情况2:分支已合并为默认值

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

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

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

希望这对将来的读者有所帮助。


3
对于像我这样的Mercurial新手来说,很好的明确答案。并且感谢您没有使用“ ci”,它没有被hg help列出为命令之一,所以我不知道这是什么意思:)
MB。

8
@MB .:在这种情况下,hg help ci将向您解释。
克里斯·摩根

我相信,正如“ hg merge”命令会告诉您的那样,最后还有另一次提交
Chip Grandits

11

编辑 ouch,为时已晚...我知道您读过您的评论,指出您希望保留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

我可能误解了您想要什么,但请不要修改,我花了一些时间重现您的用例:)


7

奇怪的是,还没有人提出关闭功能分支的最可靠方法……您可以合并提交与--close-branch标志结合使用(即,提交修改后的文件并同时关闭分支):

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

所以,仅此而已。没人再写稿子了。没有额外的提交。


我已经在答案中提到了它:““”一个人可以使用--close-branch将对功能分支的最后一次实际提交与此额外的提交结合起来,但是应该提前知道哪个提交将是最后一个。 “
Andrey Vlasovskikh 2015年

好的我明白了。我只是不太了解句子的最后一部分(“但是应该知道...”),所以我认为它的含义有所不同。我还要指出,大多数GUI工具(TortoiseHG,SourceTree等)不支持此方法。
tav 2015年

@AndreyVlasovskikh这个答案的重点是在合并中关闭分支,而不是在功能分支的最后一次提交中关闭。
kasperd 2015年

@tav在发出merge命令之前,最好使用一个方法hg branch来验证合并的分支名称是否是您要保持打开状态的分支。
kasperd 2015年

2
仔细看,合并似乎总是在关闭的分支上。理想的结果将是在其父项之一的分支上并且关闭其另一父项的分支。这似乎是不可能的。因此,这毕竟不是一个可行的解决方案。太糟糕了,我真的很想使用合并作为分支的结束点。
卡巴斯德(Kasperd),2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.