0

我有一个存储库,其中开发人员在将代码提交到各种命名分支时出错。本质上,发生的事情是这样的:

A - B - C
 \
  W - X - D - E - Y - Z

其中 ABCDE 都(假定)是主分支的一部分,而 WXYZ 是新命名分支上的提交。开发人员在更改“D”和“E”之前未能更新到“C”,然后在它们之上提交了“Y”和“Z”。

我需要将“D”和“E”移到主分支上,不包括 WXYZ。

A - B - C - D - E
 \
  W - X - Y - Z

总的来说,我对 Hg 不是很了解,但我正在学习,并且愿意。我看过变基,但这似乎并没有把我带到我需要去的地方。我可以让开发人员取消他的更改,然后在适当的位置重新应用它们,但这似乎并不完全“正确”。

你将如何解决这个问题?

谢谢!

4

2 回答 2

2

最安全的方法可能是将修订从一个分支复制到另一个分支,然后使用以下命令将它们从他们承诺的分支中撤出(用这些变更集的修订号替换字母):

> hg up C
> hg graft D:E
> hg up Z
> hg backout D:E
> hg commit -m "Backout changes D to E"

这会保留默认分支,但会在命名分支中留下一些错误的修订,这些修订在一次提交中被撤销。

如果要编辑历史记录,hg rebase可以使用以下命令:

> hg rebase -r Y:Z -d X
> hg rebase -r D:E -d C -D

在执行此操作之前,您可能需要将变更集的阶段更改为草稿(这样做hg phase -d rev

如果你走 rebase 路线,那么你需要确保存储库的所有克隆都被删除并重新克隆,以确保删除的历史不会回来。如果您有一个大型团队,那么这可能很危险,这就是我建议第一个选项的原因。

于 2012-08-24T19:51:10.187 回答
1

除了 Steve Kaye 发布的出色的撤销想法,我建议使用Mercurial Queues扩展来试验补丁队列。如果您将 D、E、Y 和 Z 导入补丁队列,您可以在 B 之上应用补丁 D 和 E,然后在 X 之上应用 Y 和 Z。

如果对 ABCD 分支的更改与 WXYZ 是分开的,那么这应该会成功,没有任何问题。但是,如果 ABCD 和 WXYZ 更改相似(即:触摸文件中的相同行、重命名文件等),那么您可能会得到一些被拒绝的文件。

于 2012-08-27T00:28:49.580 回答