我可以将分支指向mercurial中的新HEAD吗?

时间:2013-01-18 02:40:29

标签: mercurial branching-and-merging

我们有两个主要的发布分支 - “稳定”和“测试版”。随着时间的推移,'beta'分支收到的变化没有进展到稳定,但从未被删除。

我想做的是再次将beta与稳定同步,以便它们完全相同。这是可能的mercurial同时保持相同的分支名称?

我们为beta设置了基本部署,其中分支上的接收提交推送到所有Web服务器。我可以刚开始一个新的分支,但这会引起混淆。

基本上我想这样做:

hg update stable
hg branch beta --overwrite

2 个答案:

答案 0 :(得分:2)

如果您使用Mercurial书签,那么是。书签是指向更改集的指针,因此您可以强制它们指向您想要的任何位置(如果您了解它们,它们就像git branches一样)。 Mercurial 命名分支虽然是附加到每个变更集的不可磨灭的标签。当您在谈论命名分支时,“head”是具有该分支名称的“最尖端”(基本上是最新的)变更集,因此您无法在不删除具有该分支的所有祖先的情况下将较旧的变更集作为头部名。

这是一个可能有用的图表。对于每个变更集,“分支”是其分支名称(每个变更集都有一个,但如果它是default则在大多数UI上下文中都不显示):

  [0]  (branch: default)
   |
  [1]  (branch: default)
   | \
  [2] \    (branch: default)
   |   [3]   (branch: beta)
  [4]   |    (branch: stable)
   |   [5]   (branch: beta
  [6]        (branch: stable)

在此图中, 2个拓扑头,变更集6和5,但 3个总头,2,5和6。

变更集5是分支beta的负责人,因为它是具有分支名称的“最新”变更集。变更集6是分支stable的负责人,因为它是具有分支名称的“最新”变更集。并且,变更集2是分支default的负责人,因为它是具有该名称的最新变更集。

所以,如果我理解你的问题,你不能让变更集6,这是一个分支稳定,也是分支beta的负责人,因为每个变更集都在一个且只有一个分支 - 因此一个变更集不能是两个不同命名分支的头部。

但是,你有很多选择:

在分支测试版上创建一个新的变更集,其外观与当前的稳定版主题完全相同:

 hg checkout stable # makes the working directory look like changeset 6
 hg branch beta     # tell mercurial that the next changeset created should be on branch 'beta'
 hg commit         # creates changeset 7 on branch beta w/ contents of changeset 6

你可能需要做一些微小的改变才能提交(避免“没有改变”),但这就是它的要点。由于您的新变更集的文件数量为6,但是分支标签为“beta”且比5更新... poof它是'beta'的新主管。

切换到使用书签 - 它们更像是您想象分支机构的工作方式。它们是变更集的指针,多个指针可以指向相同的变更集。

答案 1 :(得分:2)

<强>回退的溶液

为了从结果中排除(不在分支历史中),你可以a)退出beta分支中的“停滞”变更集b)将稳定合并到beta

<强>调整基线的溶液

创建其他分支,将不需要的变更集重新绑定到此分支,将稳定版合并到beta

<强> MQ-溶液

安装mq,将有问题的changesets转换为MQ补丁,取消应用所有mq-pathes,将stable stable合并到beta

加成

如果未知的β变更集未知

(Ry4an图用作命令的来源)

Diff-patch方式

想法:在测试版之上添加“更正变更集”,这会将测试结果带入状态,与分支稳定状态相同@ 6

实施:hg up beta & hg diff -r beta -r stable | hg import - & hg commit -m "Beta synced"

新的分支方式

想法:忘记旧的过时分支测试版,从头开始创建测试版,当前稳定状态

实施:hg up beta & hg commit -m "Closing branch" --close-branch & hg up stable & hg branch -F beta & ... & hg commit -m "Reopen new beta"