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

And*_*ikh 238 merge mercurial branch hg-merge

我已经完成了一个功能分支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
Run Code Online (Sandbox Code Playgroud)

所以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
|
Run Code Online (Sandbox Code Playgroud)

更新:从版本1.5开始,Mercurial似乎不再显示输出中已关闭分支的头部hg heads.

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

相关问题:

And*_*ikh 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)
Run Code Online (Sandbox Code Playgroud)

另一种方法是在使用额外提交合并之前关闭功能分支:

$ 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)
Run Code Online (Sandbox Code Playgroud)

第一个更简单,但它留下了一个开放的分支.第二个没有留下开放的头/分支,但它需要一个辅助提交.可以使用此额外提交将最后一次实际提交与功能分支组合--close-branch,但是应该事先知道哪个提交将是最后一次提交.

更新:由于水银1.5,你可以随时关闭分支,所以它不会出现在两个hg brancheshg heads了.唯一可能让你恼火的是技术上修订图还会有一个没有孩子的修订.

更新2:由于Mercurial 1.8 书签已成为Mercurial的核心功能.书签比分支分支更方便分支.另见这个问题:

  • 对于分支来说,书签比命名分支更方便.Hg书签与Git分支不同.它们充满了许多边缘情况,使它们不适合作为特征分支.例如:当您克隆存储库时,您将在`default`分支中得到最新的提交.如果使用书签,则此更改集对应于随机(不稳定)书签.如果使用命名分支,您将获得stable/default分支中的最新提交,这通常是您想要的.书签将在某一天到达,但他们还没有. (2认同)

Nac*_*mpi 79

imho有两个忘记关闭的分支机构

案例1:分支未合并为默认值

在这种情况下,我更新到分支并使用--close-branch进行另一次提交,不幸的是,这会选择分支成为新的提示,因此在将其推送到其他克隆之前,我确保真正的提示会收到更多更改,而其他提示不要对这个奇怪的小费感到困惑.

hg up myBranch
hg commit --close-branch
Run Code Online (Sandbox Code Playgroud)

案例2:分支合并为默认值

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

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

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch
Run Code Online (Sandbox Code Playgroud)

希望这有助于未来的读者.

  • @MB.:在这种情况下,`hg help ci`会向你解释. (8认同)
  • 像我这样的Mercurial新手的明确答案.并且谢谢你没有使用未被hg帮助列为命令之一的"ci",所以我不知道这意味着什么:) (3认同)

Syn*_*r0r 11

编辑哎哟,太晚了......我知道读你的评论说你要保留feature-x changeset,所以这里的克隆方法不起作用.

我仍然会在这里给出答案,因为它可以帮助别人.

如果你想完全摆脱"功能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
Run Code Online (Sandbox Code Playgroud)

所以你这样做:

hg clone . ../cleanedrepo --rev 7
Run Code Online (Sandbox Code Playgroud)

你会得到以下内容,你会发现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
Run Code Online (Sandbox Code Playgroud)

我可能误解了你的想法,但请不要修改,我花时间复制你的用例:)


tav*_*tav 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
Run Code Online (Sandbox Code Playgroud)

所以,就是这样.没有一个额外的头衔.没有额外的提交.

  • 仔细观察,似乎合并将始终在关闭的分支上。期望的结果是在其父级之一的分支上并关闭其另一个父级的分支。这似乎是不可能的。所以这毕竟不是一个可行的解决方案。太糟糕了,我真的想使用合并作为分支的结束点。 (3认同)