【发布时间】:2010-06-21 03:41:51
【问题描述】:
诚然,这是一个误导性的标题,但我不知道如何更好地表达它。
所以我犯了一个错误,在我打开一个分支之前推送我所有的项目特定更改。这样,默认分支中有一些不属于那里的变更集。他们应该在我新开的分店里。
我是否必须先退出所有变更集,然后再将它们推送到正确的分支?这还有效吗?
感谢您的帮助。
【问题讨论】:
标签: mercurial version-control branch
诚然,这是一个误导性的标题,但我不知道如何更好地表达它。
所以我犯了一个错误,在我打开一个分支之前推送我所有的项目特定更改。这样,默认分支中有一些不属于那里的变更集。他们应该在我新开的分店里。
我是否必须先退出所有变更集,然后再将它们推送到正确的分支?这还有效吗?
感谢您的帮助。
【问题讨论】:
标签: mercurial version-control branch
如果不求助于 EditingHistory(通常建议再次这样做,并且肯定与反复无常的“不可变历史”设计目标相反),这些更改将永远存在于您的历史中。但是,您可以在您的“提示”修订版中撤消它们,然后在分布在多个分支的多个后续变更集中将它们滴回。
让我们想象一下这是你目前的历史:
[R0] -> [R1] -> [R2] -> [R3]
修订版 R2 和 R3 在默认分支中有一些你想要的东西,而你希望在不同的分支中有一些东西。您可以创建一个新的修订版 R4,以撤消 R2 和 R3。这可以按照您的建议使用 backout 来完成,或者由于您正在执行多个变更集,使用“revert”可能更容易。
hg update tip ; hg revert --all -r R2 ; hg commit -m 'undid changes R2 and R3'
那么您的历史记录将如下所示:
[R0] -> [R1] -> [R2] -> [R3] -> [R4]
然后您可以将您的工作拆分为您希望最初完成的变更集,从而产生如下历史记录:
[R0] -> [R1] -> [R2] -> [R3] -> [R4] -> [R5] -> [R7]
\
--> [R6] -> [R8]
R6 和 R8 可以位于名为“default”的分支上,也可以位于不同的命名分支上。无论哪种方式,您都可以通过以下方式将 R0 推送到 R5 和 R7:
hg push -r R7
之所以有效,是因为推送会推送修订及其所有祖先——但 R6 和 R8 不是 R7 的祖先,因此无论它们在哪个分支上都不会被推送。
【讨论】: