2

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

我想做的是再次将 beta 与 stable 同步,因此它们完全相同。在保持相同分支名称的同时使用 mercurial 是否可行?

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

基本上我想这样做:

hg update stable
hg branch beta --overwrite
4

2 回答 2

2

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

这是一个可能有帮助的图表。对于每个变更集,“分支”是它的分支名称(每个变更集都有一个,但如果是,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因为每个变更集都在一个且只有一个分支上——因此单个变更集不能成为分支的负责人两个不同命名的分支。

但是,您确实有很多选择:

在分支 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 更新...噗,它是“beta”的新负责人。

或者

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

于 2013-01-18T03:43:59.577 回答
2

退出解决方案

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

变基解决方案

创建额外的分支,将不需要的变更集重新设置到此分支,将稳定版合并到 beta

MQ-解决方案

安装 mq,将 changeset-in-question 转换为 MQ-patches,取消应用所有 mq-path,将 stable 合并为 beta

添加

如果 beta 中不需要的变更集未知

(用作命令源的 Ry4an 图)

差异补丁方式

想法:在 beta 之上添加“更正变更集”,将 beta 带入状态,与分支 stable@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"

于 2013-01-18T07:08:05.097 回答