Hg命名为分支错误提交清理

时间:2012-08-24 18:22:50

标签: mercurial kiln

我有一个存储库,开发人员在将代码提交到各种命名分支时出错。基本上,发生了什么:

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并不十分了解,但我正在学习并且愿意。我看过rebase,这似乎并没有把我带到我需要去的地方。我可以让dev退出他的更改,并在适当的位置重新应用它们,但这看起来并不正确。

您将如何解决此问题?

谢谢!

2 个答案:

答案 0 :(得分: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路线,那么你需要确保删除并重新克隆存储库的所有克隆,以确保删除的历史记录不会返回。如果你有一个庞大的团队那么这可能是危险的,这就是我建议第一个选择的原因。

答案 1 :(得分:1)

除了Steve Kaye发布的优秀退出意见外,我还建议使用Mercurial Queues扩展程序试验补丁队列。如果将D,E,Y和Z导入补丁队列,则可以在B顶部应用补丁D和E,然后在X上应用Y和Z.

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