2010-06-18 27 views
16

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

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

+0

从我的理解,你的猜测是相当不错准确。 mercurial的方式是'一切都是不可变的',所以如果你需要回滚你在8版本之前做的事情,'hg'的方法是引入一个新的变化。 – 2010-06-18 11:43:28

回答

13

只有一个回滚级别,因为回滚从来没有真正作为一个功能。回滚存在,并且名称很奇怪,因为它是由mercurial的commit/push/pull事务系统产生的。

如果网络推送进入并且已完成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 
5

诀窍是:hg rollback不仅仅是重置一些提交,它重置与存储库相关的每个数据和元数据。
它实际上有no equivalent in Git,这是一个相当危险的机制。
它可能被错误地用作通过重置它来重写历史记录的方式,并且那个can "reset" more than you wanted
要让这个在多个关卡上回来将是太危险了。

当涉及到只有resetting/rewriting changeset(这是设计,不可变),extensions like MQ更适合。

+0

我同意 - 绝对是要避免的 - 我使用MQ,所以它从来都不是我用过的。只是似乎有一个奇怪的限制 - 如果你打算允许它,为什么不允许多于一个级别的回滚。 – 2010-06-18 13:37:26

相关问题