16

我了解回滚的限制和使用时需要注意的事项,但我只是想知道为什么只有一级回滚。

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

4

2 回答 2

13

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

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

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

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

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

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

hg clone -r last_revision_I_want repo_with_things_I_do_not_want new_repo_with_only_good_stuff
于 2010-06-18T15:17:13.853 回答
5

诀窍是:hg rollback不仅仅是重置一些提交,它重置与存储库关联的每个数据和元数据。
它实际上在 Git 中没有等价物,并且是一种非常危险的机制。
它可能被误用为通过重置历史来重写历史的方式,并且可以“重置”比您想要的更多。
允许在不止一个层面上这样做太危险了。

当仅涉及重置/重写变更集(根据设计,这些变更集是不可变的)时,像 MQ这样的扩展更适合。

于 2010-06-18T11:54:47.233 回答