Mercurial:如何处理一个有两个头的分支

tho*_*lin 26 mercurial branch

如果一个分支有两个头怎么办?几个星期前我出现了这种情况,因为某些原因我当时没有将它们合并,只是继续在一个头上开发.现在我想摆脱另一个头.我该怎么办?我应该在这么多变更后合并它们吗?

Hel*_*lgi 31

所以你有这个:

o--o--o--A--B  <- older unnecessary head
       \
        1--2--3--4--5--6  <- newer ‘good’ head
Run Code Online (Sandbox Code Playgroud)

......你不需要,A而且B绝对是100%肯定的.如果您不确定,并且可能有可挽救的东西,A并且B更好地合并头部以组合变化.正如Aaron所说,Mercurial很擅长.

现在您有两个选择:

  • 摆脱旧头,或
  • 做一个忽略头部的两个头的虚拟合并B.

如果变更AB存在于其他版本库,你不要管,例如,如果其他人拉到AB到他们的仓库,或者你推AB到公共库(比如到位桶),那么你就已经发布A,并B到野外,并能摆脱它们.你应该做一个虚拟合并:

$ hg up 6
$ hg --config ui.merge=internal:local merge
Run Code Online (Sandbox Code Playgroud)

这将忽略合并时AB合并时的任何更改.

如果,另一方面,AB是私有,你可以剥夺他们:

$ hg strip A
Run Code Online (Sandbox Code Playgroud)

(Rev A和后代被剥离;使MQ扩展strip可用.)

或者,在没有更改集的情况下创建存储库的新克隆,A并且B:

$ hg clone myrepo myrepo2-clone -r 6
Run Code Online (Sandbox Code Playgroud)

(只有rev 6和祖先添加到克隆中.)


Aar*_*lla 9

如果您提交了一些更改,则会创建一个头(将更改集添加到现有的更改集).如果对于相同的变更集多次发生这种情况,则会创建几个磁头.这没什么不寻常或不好的.

通常的解决方案是合并它们.Mercurial非常擅长合并.有可能结果仍然可以在没有任何手动工作的情况下编译和运行.

只要运行hg merge,然后hg statushg diff看到两者之间发生了什么变化.如果您喜欢结果,请提交.如果你不喜欢它,update要么去清理你的工作区.

为了摆脱头脑,文档解释了如何做到这一点.

使用MQ,你也可以将第二个头转变为一个独立的分支(所以你可以保留它但不会打扰你).请参阅以下答案:如何在Mercurial中为非尖端修订创建分支?