Почему Mercurial имеет только один уровень отката? -- mercurial поле с участием rollback пол Связанный проблема

Why does Mercurial only have one level of rollback?


16
vote

проблема

русский

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

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

Английский оригинал

I understand the restrictions of rollback and the care required in its use, but I just wondered why there is only one level of rollback.

My guess it's a design decision and that the hassle of storing multiple previous transactional states to handle multiple levels of rollback is more trouble than its worth.

</div
     
 
 

Список ответов

13
 
vote
vote
Лучший ответ
 

Есть только один уровень отката, потому что откат никогда не был предназначен как функция. Отказ существует и имеет странное имя, потому что он вырос из системы Compact / push / push / push / pull.

Если сетевой толчок входит, и она выполнена 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   
 

There's only one level of rollback because rollback was never really intended as a feature. Rollback exists, and has it's odd name, because it grew out of mercurial's commit/push/pull transaction system.

If a network push is coming in and it gets 99% done and then the connection is lost the repository shouldn't be left in an inconsistent state. To make sure that an incomplete change can be discarded a "before anything happened" pointer is created before any writes are done and if the change is aborted everything is reset to that state -- rolled back.

The rollback command is really just "failing" the previous operation after it had successfully completed. It's just something that "came free" after necessary transactional security was designed in.

When using something like a controlling hook one can define checks/tests that must be passed in order for a push or commit to complete successfully. In order to not-complete successfully it must be possible to undo that in progress commit, but that doesn't require multiple levels either.

As VonC correctly notes rollback can be pretty dangerous. Many a person rollsback changes they've already pushed and then gets very confused when other those changes come back on subsequent pulls. The hg backout command is almost always a better idea.

Note also that you can simulate a rollback to any point in time easily by doing this:

hg clone -r last_revision_I_want repo_with_things_I_do_not_want new_repo_with_only_good_stuff 
</div
 
 
5
 
vote

Хитрость: <Код> hg rollback не только о сбросе некоторых коммитов, он сбрасывает все данные и метаданные, связанные с репозитором.
На самом деле он имеет Нет эквивалента в Git и довольно опасный механизм.
Он может быть использован в качестве способа переписать историю, сбрасывая его, а что может «сбросить» больше, чем вы хотели .
Чтобы позволить этому более чем на один уровень назад был бы слишком опасен.

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

 

The trick is: hg rollback is not just about resetting some commits, it reset every data and meta-data associated with the repository.
It actually has no equivalent in Git, and is quite a dangerous mechanism.
It can be mis-used as a way to rewrite the history by resetting it, and that can "reset" more than you wanted.
To allow this on more than one level back would be too dangerous.

When it comes only to resetting/rewriting changeset (which are, by design, immutable), extensions like MQ are better suited.

</div
 
 
 
 

Связанный проблема

8  Откатываясь в старую редацию в Mercurial (например, сброс Git)  ( Rolling back to an old revision in mercurial like git reset ) 
Использование git, я могу выбросить ошибку или случайные коммита, используя команду, как <код> git reset --soft HEAD^ Что сбрасывает текущую ветку (напр...

1  Модернизировано до клиента Mercurial 1.7, получение прерваний: требование «<HTML>» не поддерживается  ( Upgraded to mercurial 1 7 client getting abort requirement html not suppor ) 
Я думаю, что это ошибка конфигурации, основанная на аналогичных, но не одинаковых ответов на ошибки, которые я обнаружил, таких как требование «fncache» не по...

17  Как решить сообщение об ошибке «Abort: Repository Default-push не найден! "В Mercurial?  ( How to solve error message abort repository default push not found in mercu ) 
Я новичок в Mercurial и попытался протолкнуть тестовый файл в репозиторий в Интернете. Я столкнулся с сообщением об ошибке как abort: repository default-push...

5  Игнорировать определенные команды Mercurial в крюке Mercurial  ( Ignore certain mercurial commands in mercurial hook ) 
У меня есть крюк Mercurial, как так: <код> [hooks] pretxncommit.myhook = python:path/to/file:myhook с кодом, похожим на это: <код> def myhook(ui, repo...

111  Могу ли я сквош комбинироваться в Mercurial?  ( Can i squash commits in mercurial ) 
У меня есть пара коммитов, которые действительно должны быть только одна. Если бы я использовал Git, я бы использовал: <код> git rebase -i <some-commit-befo...

5  Как я могу получить Mercurial для того, чтобы снова выдвигать коммиты?  ( How can i get mercurial to push commits again ) 
Я не знаю, что я ничего изменил и работаю Ubuntu 10.10. Mercurial работает нормально, а затем внезапно, когда я начал толкать сегодня утром, я начал получать ...

0  PHP длинный рабочий скрипт  ( Php long running script ) 
Как я могу обеспечить обратную связь для команды оболочки, которая может работать довольно некоторое время? Например, мне нужен скрипт, который делает HG кл...

0  Как сказать NetBeans использовать SVN вместо Mercurial?  ( How do i tell netbeans to use svn instead of mercurial ) 
Я совершал файлы на мой хранилище SVN в течение нескольких месяцев, но вдруг по какой-то причине вариант Commit Soft Shump седет или отсутствует повсюду. Я ис...

2  Удалить пароль из Mercurial_keyring (TortoiseHG в Windows)  ( Remove password from mercurial keyring tortoisehg on windows ) 
Я использую TortoiseHG на Windows XP. У меня включено расширение Mercurial_keyring. После того, как пароль хранится через расширение Mercurial_keyring, есть...

3  TFS SLALVE VS DVCS (E.G GIT, MERCURIAL) Оффлайн комбинирует  ( Tfs shelve vs dvcs e g git mercurial offline commits ) 
При представлении концепций DVCS к моим сотрудникам с использованием TFS, я был наткнужден следующими вопросами: "Как эти« автономные комбиниты »отличаются...

2  Mercurial Repository и файлы со странными именами  ( Mercurial repository and files with strange names ) 
У меня есть репозиторий Mercurial, а внутри него файл, который заканчивается '& gt; & gt;'. При выполнении HG клона из этого репозитория Windows я получаю сле...

4  Какой лучший способ отслеживать частные файлы в общественном репозитории Mercurial?  ( Whats the best way to track private files in a public mercurial repository ) 
"Если это не в контроле источника, оно не существует." Этот вопрос был рассмотрен здесь: Методы для обработки частных И публичный репозиторий? . Как насчет...

0  Как я могу ссылаться на местный репозиторий Mercurial в Maven, если это два каталога?  ( How can i reference a local mercurial repository in maven if it is two directori ) 
Мы использовали URL-адреса SCM в POM-файлах, как это: <код> <scm> <connection>scm:hg:file:///${basedir}</connection> <developerConnection>scm:hg:fil...

107  TortoiseHg применить патч  ( Tortoisehg apply a patch ) 
tortoisehg позволяет вам отправлять почтовый файл исправления ваших изменений в ком-то, но поддерживает ли он применять патчи? Если так, как вы применяете п...

41  Отменить действие Удалить в Mercurial  ( Undo a remove action in mercurial ) 
Предположим, что я сделал некоторые изменения в рабочем каталоге и случайно помечали несколько файлов (которые включают некоторые из модифицированных) для уда...

Связанный проблема

8  Откатываясь в старую редацию в Mercurial (например, сброс Git) 
1  Модернизировано до клиента Mercurial 1.7, получение прерваний: требование «<HTML>» не поддерживается 
17  Как решить сообщение об ошибке «Abort: Repository Default-push не найден! "В Mercurial? 
5  Игнорировать определенные команды Mercurial в крюке Mercurial 
111  Могу ли я сквош комбинироваться в Mercurial? 
5  Как я могу получить Mercurial для того, чтобы снова выдвигать коммиты? 
0  PHP длинный рабочий скрипт 
0  Как сказать NetBeans использовать SVN вместо Mercurial? 
2  Удалить пароль из Mercurial_keyring (TortoiseHG в Windows) 
3  TFS SLALVE VS DVCS (E.G GIT, MERCURIAL) Оффлайн комбинирует 
2  Mercurial Repository и файлы со странными именами 
4  Какой лучший способ отслеживать частные файлы в общественном репозитории Mercurial? 
0  Как я могу ссылаться на местный репозиторий Mercurial в Maven, если это два каталога? 
107  TortoiseHg применить патч 
41  Отменить действие Удалить в Mercurial