2012-08-24 24 views
0

我有一个存储库,其中开发人员在向各种命名分支提交代码时发生错误。从本质上讲,事情的经过是这样的:Hg命名分支Errant Commit Clean

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,这似乎并没有把我带到需要去的地方。我可以让开发人员撤销他的更改,并将他们重新应用到适当的位置,但这看起来并不正确。

你将如何着手解决这个问题?

谢谢!

回答

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这是否)

如果你走基地路线,那么你需要确保库的所有克隆都被删除并重新克隆,以确保删除的历史不会回来。如果你有一个庞大的团队,那么这可能是危险的,这就是为什么我建议第一个选择。

+0

谢谢....我可以看到我有更多的学习要做。我从来没有见过'up'和'graft'命令。 – reidLinden

+0

哦...我想'up'只是'更新'的简写...... – reidLinden

+0

好吧,我没有'rebase -r'并且没有'移植'命令......我只是有趣的错误。此外,在Y:Z切片重新绑定给了我错误(使用“#1:#2”)。不知道为什么它不起作用,但我可以用'-s'开关工作,尽管我的最终结果(在我的db的测试克隆上)没有按照我想要的方式出现。 .. – reidLinden

1

除了Steve Kaye发布的优秀退出创意之外,我还建议您使用Mercurial Queues扩展名来尝试修补程序队列。如果将D,E,Y和Z导入到补丁队列中,则可以在B之上应用补丁D和E,然后在Y之上应用Y和Z.

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

+0

是的,我认为这将有可能与队列,但还没有(带)有机会学习如何使用它们。 – reidLinden