Ответ 1
Там только один уровень отката, потому что откат никогда не был действительно предназначен как функция. Откат существует и имеет это странное имя, потому что оно выросло из транзакционной системы mercurial commit/push/pull.
Если происходит нажатие на сеть, и оно на 99% выполнено, а затем соединение потеряно, репозиторий не должен оставаться в несогласованном состоянии. Чтобы убедиться, что неполное изменение может быть отброшено, "прежде чем что-либо случится", указатель создается до того, как будут выполнены какие-либо записи, и если изменение отменено, все будет reset к этому состоянию - откат назад.
Команда rollback
действительно просто "сбой" предыдущей операции после ее успешного завершения. Это просто то, что "стало бесплатным" после того, как была создана необходимая транзакционная безопасность.
При использовании чего-то вроде контрольного крючка можно определить проверки/тесты, которые должны быть переданы для успешного завершения push или commit. Для того чтобы не было успешно завершено, должно быть возможно отменить то, что выполняется, но это не требует нескольких уровней.
Как отмечает VonC, откат может быть довольно опасным. Многие изменения отката человека, которые они уже вытолкнули, затем сильно запутываются, когда другие изменения возвращаются при последующих попытках. Команда hg backout
почти всегда является лучшей идеей.
Обратите также внимание на то, что вы можете легко моделировать откат в любой момент времени, делая это:
hg clone -r last_revision_I_want repo_with_things_I_do_not_want new_repo_with_only_good_stuff