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

Mercurial:改变阶段的后果是什么?,mercurial,phase,Mercurial,Phase,在Mercurial中,修订的阶段可以任意更改。相变对所有可能的转换(公共、草稿、秘密)x(公共、草稿、秘密)有什么影响?哪些相变是安全的?哪些可能会引起麻烦,哪些类型的麻烦?哪些是或多或少的无操作?提交的默认阶段是draft,这就是当阶段不存在时的处理方式。当按下草稿变更集时,mercurial会自动将其阶段更改为公共。您可以使用它来了解已发布或未发布的变更集 但真正的问题是,当变更集处于public阶段时,mercurial不允许您使用历史编辑扩展(如mq,重设基址等)对其进行更改。这非常重

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

提交的默认阶段是
draft
,这就是当阶段不存在时的处理方式。当按下
草稿
变更集时,mercurial会自动将其阶段更改为
公共
。您可以使用它来了解已发布或未发布的变更集

但真正的问题是,当变更集处于
public
阶段时,mercurial不允许您使用历史编辑扩展(如
mq
重设基址
等)对其进行更改。这非常重要,因为历史记录编辑只在本地存储库中进行,它们不会通过
pull
/
push
操作传播。因此,一旦发布了变更集,它就失去了控制,更改它是危险的

您可以从任何阶段更改为任何其他阶段。“正常流程”将移动到更高的阶段(机密->草稿->公开),但Mercurial允许使用
--force
选项更改到较低的阶段。相变本身是无害的。例如,当从
public
移动到
draft
secret
时,唯一发生的事情是历史编辑保护被删除,除此之外,pull和push仍将正常工作,Mercurial永远不会对变更集产生混淆,因为它们具有唯一的标识符。这样的相变后发生的历史记录编辑操作可能会导致问题。这就是为什么Mercurial在相变中给出警告,并要求使用
--force
选项,以确认这是您真正想要的

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

  • 无法使用历史记录编辑工具(即
    mq
    rebase
    )编辑公共版本
  • 无法将机密修订版推送到另一个存储库(当您发出push命令时,或当另一个存储库尝试拉取时,它将被忽略)
  • 草稿修订版允许两者兼有,但如果推送到另一个存储库,它将自动更改为public
阶段系统的目的是防止您在将修订推送到另一个存储库后修改该修订,这是一个坏主意,除非您能够从推送到的所有存储库中删除修订的旧版本


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

感谢这些详细信息,但是它没有回答我的问题:更改现有变更集的阶段时会发生什么?例如,对于已推送的变更集,从公开到保密?这能起作用吗?或者它会混淆Mercurial吗?你可以从任何阶段转换到任何其他阶段。如果您试图切换到较低的阶段,则必须使用
--force
进行确认。相变本身不会引起任何问题。导致问题的原因是您在更改阶段后所做的操作。当您从
public
更改为
draft
时,您正在删除对历史编辑的保护,它让你把事情搞得一团糟。Mercurial呢?它会因为从public改为draft而变得混乱吗?最糟糕的情况是,Mercurial版本不使用阶段时总是会发生这样的情况:如果你编辑已经推送的历史,你会与下游存储库产生不匹配。麻烦,但通常没什么大不了的,换句话说。@richard Draft->secret总是安全的。我很确定在进行转换时的警告会被视为一个bug。