Merge 如何正确关闭Mercurial中的功能分支?
我已经完成了功能分支的工作Merge 如何正确关闭Mercurial中的功能分支?,merge,mercurial,branch,hg-merge,Merge,Mercurial,Branch,Hg Merge,我已经完成了功能分支的工作feature-x。我想将结果合并回默认分支并关闭feature-x,以便在hg分支的输出中去除它 我提出了以下方案,但存在一些问题: $ 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分支(changests40-41)关闭,但有一个新的头,关闭分
feature-x
。我想将结果合并回默认
分支并关闭feature-x
,以便在hg分支
的输出中去除它
我提出了以下方案,但存在一些问题:
$ 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
分支(changests40
-41
)关闭,但有一个新的头,关闭分支变更集44
,每次都将在hg头中列出:
$ 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
的输出中显示闭合分支的头
是否可以关闭合并的分支而不留下一个头部?是否有更正确的方法关闭要素分支
相关问题:
编辑哎哟,太晚了。。。我知道你的评论说你想保留feature-x变更集,所以这里的克隆方法不起作用
我还是把答案放在这里,因为它可能会帮助别人
如果你想完全摆脱“功能X”,例如,因为它不起作用,你可以克隆。这是本文中解释的方法之一,它确实有效,并且它专门讨论了HEAD
据我所知,您有这样的想法,希望一劳永逸地摆脱“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
我可能误解了您的要求,但请不要修改,我花了时间复制了您的用例:)一种方法是让合并的功能分支保持打开状态(并且处于非活动状态):
另一种方法是在使用额外提交进行合并之前关闭功能分支:
$ 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分支
和hg头
中。唯一可能让你恼火的是,从技术上讲,修订图在没有childen的情况下还会有一次修订
更新2:自Mercurial 1.8以来,书签已成为Mercurial的核心功能。书签对于分支比命名分支更方便。另见这个问题:
imho有两种情况下分支机构忘记关闭
案例1:
分支未合并到默认值中
在本例中,我更新到分支并使用--close分支进行另一次提交,不幸的是,这会选择该分支成为新的提示,因此在将其推送到其他克隆之前,我确保真正的提示收到更多更改,其他人不会对该奇怪提示感到困惑
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
希望这对未来的读者有所帮助。奇怪的是,还没有人提出关闭功能分支的最可靠的方法。。。
您可以将合并合并提交与--close分支标志(即提交修改的文件并同时关闭分支):
就这些。转速表上没有额外的人头。没有额外的提交。@Andrey:但文章指出,这篇文章不仅涉及“关闭分支”。它显示了四种修剪树枝的方法。如果你真的不想要它了,你可以按照文章中的解释进行克隆。唯一的“问题”是,无论出于什么原因,你都想关闭它,但要保留它。@WizardOfOdds是的,我已经阅读了整篇关于修剪枯枝的文章。我希望分支留在修订历史中,而不是将其丢弃。之前我只是将功能分支合并到default
,而没有“关闭”它们。它产生了0个新的头,但这些分支在hg branchs
中永远可见(作为非活动分支)。要开发功能,我倾向于克隆整个存储库,然后在功能完成后将其合并回来。我不喜欢在历史上留下(封闭的)分支机构的遗迹。对于像我这样善变的新手来说,这是一个很好的明确答案。谢谢你没有使用“ci”,因为它没有被hg-help列为命令之一,所以我不知道它是什么意思:)@MB.:在这种情况下,hg-help-ci
会向你解释。我相信“hg-merge”命令会告诉你,末尾还有另一个提交。书签比命名分支更方便进行分支,这并不一定是真的。Hg书签与Git分支不同。它们充满了许多边缘情况,这使得它们不适合作为特征分支。例如:克隆存储库时,您将在default
分支中得到最新的提交。如果使用书签,则此变更集对应于随机(不稳定)书签。如果使用命名分支,您将获得稳定/默认分支中的最新提交,这通常是您想要的。书签总有一天会出现,但它们还没有出现。我使用书签作为私有标记,这些标记只在本地存储库中可见。它们充当我需要重新访问的变更集的提醒。我尝试采用这种方法,但在尝试推送时仍然出现错误:中止:推送创建新的远程分支:
。我能吃点什么
hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch
hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f