【发布时间】:2012-10-25 15:14:51
【问题描述】:
在 Mercurial 中,可以任意更改修订的阶段。对于所有可能的过渡(公共、草稿、秘密)x(公共、草稿、秘密),相变的后果是什么?哪些相变是安全的?哪些可能会引起麻烦,哪些麻烦?哪些或多或少是无操作?
【问题讨论】:
在 Mercurial 中,可以任意更改修订的阶段。对于所有可能的过渡(公共、草稿、秘密)x(公共、草稿、秘密),相变的后果是什么?哪些相变是安全的?哪些可能会引起麻烦,哪些麻烦?哪些或多或少是无操作?
【问题讨论】:
提交的默认阶段是draft,这就是当阶段不存在时它们的处理方式。当推送 draft 变更集时,mercurial 会自动将其阶段更改为 public。您可以使用它来了解您已经发布了哪些变更集。
但真正的问题是,当变更集处于 public 阶段时,mercurial 不会让您使用历史编辑扩展(如 mq、rebase 等)来更改它们。这非常重要,因为历史编辑仅在本地存储库中发生,它们不会通过pull/push 操作传播。因此,一旦发布变更集,它就会失去控制,更改它是很危险的。
您可以从任何阶段更改为任何其他阶段。 “正常流程”是移动到更高的阶段(secret->draft->public),但 Mercurial 允许使用 --force 选项更改到较低的阶段。单独的相变是无害的。例如,当从public 移动到draft 或secret 时,唯一发生的事情是历史编辑的保护被删除了,没有别的,pull 和 push 仍然可以正常工作,Mercurial 永远不会混淆变更集,因为它们具有唯一标识符。在像这样的相变之后发生的历史编辑操作可能会导致问题。这就是为什么 Mercurial 在相变中发出警告并需要 --force 选项,以确认这就是您真正想要的。
通常不应修改已发布的提交,这是阶段试图确保的。但也许您确实可以控制所有存储库。或者也许你推了一些东西,你知道还没有其他人拉它。无论是什么原因,您都可以选择强制变更集的阶段回到草稿和编辑它们。但是这个版本必须在每个包含变更集的存储库中完成。
【讨论】:
--force 进行确认。相变本身不会造成任何问题。可能导致问题的是您在更改相位后所做的事情。当您从 public 更改为 draft 时,您正在取消对历史编辑的保护,它会让您搞砸。
mq、rebase)编辑公共修订。阶段系统的目的是防止您在将修订推送到另一个存储库后对其进行修改,这是一个坏主意,除非您能够从它所在的所有存储库中删除该修订的旧版本被推到了。
所有阶段变化或多或少都是无操作的;它只是一个标记,用于指示修改是否安全。
【讨论】: