Подтвердить что ты не робот

Почему Mercurial имеет только один уровень отката?

Я понимаю ограничения откат и уход, необходимый при его использовании, но я просто задавался вопросом, почему существует только один уровень отката.

Я предполагаю, что это дизайнерское решение и что проблема хранения нескольких предыдущих транзакционных состояний для обработки нескольких уровней отката - это больше проблем, чем того стоит.

4b9b3361

Ответ 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

Ответ 2

Трюк: hg rollback - это не просто сброс некоторых коммитов, а reset всех данных и метаданных, связанных с репозиторием.
Фактически нет эквивалента в Git, и это довольно опасный механизм.
Он может быть неправильно использован как способ переписать историю, сбросив его, и что может reset" больше, чем вы хотели. < ш > Разрешить это на более чем одном уровне назад было бы слишком опасно.

Когда дело доходит до сброса/перезаписи наборов изменений (которые, по замыслу, неизменяемы), расширения, такие как MQ, лучше подходят.