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

Nic*_*int 16 mercurial rollback

我理解回滚的限制和使用中所需关注,但我只是想知道为什么只有一个级别的回滚.

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

Ry4*_*ase 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
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 5

诀窍是:hg rollback不只是重置一些提交,它重置与存储库关联的每个数据和元数据.
它实际上在Git没有等价物,并且是一种非常危险的机制.
它可能被误用作重置历史记录重写历史的方法,并且可以"重置"超出你想要的程度.
要在多个级别上允许这样做太危险了.

当它只涉及重置/重写变更集(通过设计,不可变)时,像MQ这样的扩展更适合.