Mercurial:更改阶段的后果是什么?

11

在Mercurial中,修订版本的阶段可以任意更改。对于所有可能的转换 (公共、草稿、秘密) x (公共、草稿、秘密),阶段更改的后果是什么?哪些阶段更改是安全的?哪些可能会引起麻烦,以及麻烦的种类是什么?哪些是无操作或几乎不需要操作的?

2个回答

12

默认情况下,提交的阶段是draft,在没有这些阶段的情况下就是如此处理的。当推送一个draft变更集时,Mercurial会自动将其阶段更改为public。您可以使用它来知道哪些更改集已经发布或尚未发布。

但真正的问题是,当变更集处于public阶段时,Mercurial不允许您使用历史编辑扩展(例如mqrebase等)对其进行更改。这非常重要,因为历史编辑仅在本地仓库中发生,它们不随pull/push操作传播。因此,一旦变更集被发布,它就失去了控制权,更改它是很危险的。

您可以从任何阶段更改到任何其他阶段。"正常流程"是向更高的阶段移动(secret->draft->public),但是Mercurial允许使用--force选项更改到较低的阶段。单独进行相位更改是无害的。例如,从public移动到draftsecret时唯一发生的事情是历史编辑的保护被撤销,没有其他影响,pullpush仍然正常工作,因为它们有唯一的标识符。在此类相位更改之后发生的历史编辑操作才会导致问题。这就是为什么Mercurial在相位更改时给出警告并要求使用--force选项作为确认你真正想做的事情。

通常情况下,已发布的提交不应进行修改,这就是阶段试图确保的内容。但也许您对所有仓库都有控制权。或者您已经推送了某些东西,而且知道没有人拉取它。无论什么原因,您都可以将变更集的相位强制回到draft并进行编辑。但必须在每个具有变更集的仓库中完成此编辑。


1
您可以从任何一个阶段转换到任何其他阶段。如果您尝试切换到较低的阶段,则必须使用--force进行确认。阶段更改本身不会导致任何问题,可能会导致问题的是在更改阶段后执行的操作。当您从“public”更改为“draft”时,您正在删除历史编辑保护,这将允许您搞砸事情。 - Rafael Piccolo
Mercurial会不会因为从公开转化为草稿而混淆呢? - mstrap
1
最糟糕的事情就是那些没有使用阶段的Mercurial版本经常发生的事情:如果您编辑已经推送的历史记录,将会在下游仓库中创建不匹配。这可能会带来一些麻烦,但通常不是什么大问题。 - alexis
那么让阶段变为“secret”的唯一方法是通过异常转换吗?即使从“draft”到“secret”始终安全,或者“secret”有什么不安全的地方吗? - ctrl-alt-delor
1
@richard 草稿 -> 秘密永远是安全的。我非常确定在进行该转换时的警告被视为一个错误。 - Brilliand
显示剩余3条评论

6
  • 一个公开的修订版不能使用历史编辑工具进行编辑(例如mq, rebase)。
  • 一个秘密的修订版不能推送到其他存储库中(当你执行推送命令或其他存储库尝试拉取时,它将被忽略)。
  • 一个草稿的修订版允许进行两者操作,但是如果它被推送到另一个存储库中,则会自动变为公开的

阶段系统的目的是防止您在将修订版推送到其他存储库后修改修订版,除非您能够从已将其推送到的所有存储库中删除旧版本的修订版,否则这是不明智的。

所有阶段更改都是几乎无操作的;它只是一个标记,指示对修订版可安全执行的操作或无法执行的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接