为啥 Mercurial 只有一级回滚?

Posted

技术标签:

【中文标题】为啥 Mercurial 只有一级回滚?【英文标题】:Why does Mercurial only have one level of rollback?为什么 Mercurial 只有一级回滚? 【发布时间】:2011-03-05 09:33:33 【问题描述】:

我了解回滚的限制和care required in its use,但我只是想知道为什么只有一个级别的回滚。

我猜这是一个设计决定,存储多个先前的事务状态以处理多级回滚的麻烦比它的价值更麻烦。

【问题讨论】:

据我了解,您的猜测非常准确。反复无常的方式是“一切都是不可变的”..所以如果您需要回滚 8 次修订前提交的内容,“hg”方式是引入一个新的更改来实现它。 【参考方案1】:

只有一个级别的回滚,因为回滚从未真正打算作为一项功能。回滚存在,并且有一个奇怪的名字,因为它源于 mercurial 的提交/推送/拉取事务系统。

如果网络推送进入并且完成了 99%,然后连接丢失,则不应让存储库处于不一致的状态。为了确保可以丢弃不完整的更改,在任何写入完成之前创建“在任何事情发生之前”指针,如果更改被中止,则所有内容都将重置为该状态 - 回滚。

rollback 命令实际上只是在成功完成后“失败”了之前的操作。它只是在设计了必要的交易安全性之后“免费”的东西。

当使用controlling hook 之类的东西时,可以定义必须通过的检查/测试,以便推送或提交成功完成。为了不成功完成,必须可以撤消正在进行的提交,但这也不需要多个级别。

正如 VonC 正确指出的,回滚可能非常危险。许多人回滚他们已经推送的更改,然后当其他这些更改在后续拉取时返回时会变得非常困惑。 hg backout 命令几乎总是一个更好的主意。

另请注意,您可以通过执行以下操作轻松模拟回滚到任何时间点:

hg clone -r last_revision_I_want repo_with_things_I_do_not_want new_repo_with_only_good_stuff

【讨论】:

【参考方案2】:

诀窍是:hg rollback 不仅仅是重置一些提交,它重置与存储库关联的所有数据和元数据。 它实际上有no equivalent in Git,是一个相当危险的机制。 它可能被误用为通过重置历史来重写历史的一种方式,并且can "reset" more than you wanted。 允许在不止一个层面上这样做太危险了。

当仅涉及resetting/rewriting changeset (根据设计,它们是不可变的)时,extensions like MQ 更适合。

【讨论】:

我同意 - 绝对要避免的事情 - 我使用 MQ,所以我从来没有使用过它。这似乎是一个奇怪的限制 - 如果您要允许它,为什么不允许超过一个级别的回滚。

以上是关于为啥 Mercurial 只有一级回滚?的主要内容,如果未能解决你的问题,请参考以下文章

在 Mercurial 中回滚多个提交(在推送到公共之前)

Mercurial Eclipse 插件中的回滚、回退和剥离有啥区别?

Git:为啥“git分支”不列出所有分支?

我们可以撤消 Mercurial 中的推送更改吗?

Mercurial:将补丁应用于工作目录

在推送之前丢弃 Mercurial 中的本地分支