我了解回滚的限制和使用时需要注意的事项,但我只是想知道为什么只有一级回滚。
我猜这是一个设计决定,存储多个先前的事务状态以处理多级回滚的麻烦比它的价值更麻烦。
只有一个级别的回滚,因为回滚从来没有真正打算作为一项功能。回滚存在,并且有一个奇怪的名字,因为它源于 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
诀窍是:hg rollback
不仅仅是重置一些提交,它重置与存储库关联的每个数据和元数据。
它实际上在 Git 中没有等价物,并且是一种非常危险的机制。
它可能被误用为通过重置历史来重写历史的方式,并且可以“重置”比您想要的更多。
允许在不止一个层面上这样做太危险了。