9

在 Mercurial 中,可以任意更改修订的阶段。对于所有可能的转换(公共、草案、秘密)x(公共、草案、秘密),相变的后果是什么?哪些相变是安全的?哪些可能会引起麻烦,哪些麻烦?哪些或多或少是无操作的?

4

2 回答 2

10

提交的默认阶段是draft,这就是当阶段不存在时它们的处理方式。推送draft变更集时,mercurial 会自动将其阶段更改为public. 您可以使用它来了解您已经发布了哪些变更集。

但真正的问题是,当变更集处于同一public阶段时,mercurial 不会让您使用历史编辑扩展(如 、 等)来更改mq它们rebase。这非常重要,因为历史编辑发生在本地存储库中,它们不会通过pull/push操作传播。因此,一旦发布变更集,它就会失控,更改它是危险的。

您可以从任何阶段更改为任何其他阶段。“正常流程”是移动到更高的阶段(秘密->草稿->公开),但 Mercurial 允许通过--force选项更改到较低的阶段。单独的相变是无害的。例如,当从publicdraft或时发生的唯一事情secret是历史编辑的保护被删除,没有别的,拉和推仍然可以正常工作,Mercurial 永远不会对变更集感到困惑,因为它们具有唯一的标识符。像这样的相变之后发生的历史编辑操作可能会导致问题。这就是为什么 Mercurial 在相变中发出警告并要求--force选择,以确认这就是您真正想要的。

一般来说,发布的提交不应该被修改,这就是阶段试图确保的。但也许您确实可以控制所有存储库。或者也许你推了一些东西,你知道还没有其他人拉它。无论是什么原因,您都可以选择强制变更集的阶段回到草稿和编辑它们。但是这个版本必须在每个具有变更集的存储库中完成。

于 2012-10-25T21:54:14.877 回答
5
  • 无法使用历史编辑工具(即,)编辑公共修订。mqrebase
  • 不能将秘密修订推送到另一个存储库(当您发出 push 命令或另一个存储库尝试拉取时,它将被忽略)。
  • 修订草案允许两者,但如果它被推送到另一个存储库,它将自动更改为公开。

阶段系统的目的是防止您在将修订推送到另一个存储库后对其进行修改,这是一个坏主意,除非您能够从它被推送到的所有存储库中删除修订的旧版本.

所有阶段变化或多或少都是无操作的;它只是一个标记,用于指示对修订进行什么是安全的或不安全的。

于 2013-07-25T23:39:43.400 回答