为什么Mercurial只有一个级别的回滚?

时间:2010-06-18 11:40:18

标签: mercurial rollback

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

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

2 个答案:

答案 0 :(得分:13)

只有一个级别的回滚,因为回滚从未真正用作功能。回滚存在,并且它的名字很奇怪,因为它来自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

答案 1 :(得分:5)

诀窍是:hg rollback不只是重置某些提交,而是重置与存储库关联的每个数据和元数据。 它实际上有no equivalent in Git,是一种非常危险的机制 它可能被误用作重置历史记录的方法,并can "reset" more than you wanted 要在多个级别上允许这样做太危险了。

当它只涉及resetting/rewriting changeset (按设计,不可变)时,extensions like MQ更适合。