2011-01-21 3 views
109

Как я могу отменить последнее последнее (не нажатое) изменение в Mercurial?Mercurial undo last commit

Если возможно, предпочтительный способ сделать это с TortoiseHg.

Update

В моем конкретном случае я совершил набор изменений (не нажат). Затем я вытащил и обновил с сервера. С этими новыми обновлениями я решил, что моя последняя фиксация устарела, и я не хочу ее синхронизировать. Похоже, что hg rollback не совсем то, что я ищу, потому что он будет откатывать pull вместо моего фиксации.

+1

Как сделать два 'hg rollback', а затем снова потянуть? – VonC

+1

Первый откат отменяет тягу, второй откат говорит мне «нет информации об откате». –

+1

Я столкнулся с той же ситуацией, и насколько я знаю, как только вы совершили какую-либо другую операцию, вы не можете вернуться или удалить ее из истории. Вам нужно будет повторно клонировать hg-репозиторий. –

ответ

68

Один из способов будет hg rollback (устаревшим Hg2.7, август 2013 г.)

Пожалуйста, используйте hg commit --amend вместо rollback, чтобы исправить ошибки в последней фиксации.

Откат последней транзакции в репозитории.

Когда committing или merging, Mercurial добавляет последний номер changeset.
Mercurial сохраняет журнал транзакций имени каждого затронутого файла и его длины до транзакции. При прерывании он обрезает каждый файл до его предыдущей длины. Эта простота является одним из преимуществ создания revlogs append-only. Журнал транзакций также позволяет выполнить операцию отмены.

См TortoiseHg Recovery section:

alt text

This thread также подробно разницу между hg rollback и hg strip:
(написанный Martin Geisler, который также вносит свой вклад в SO)

  • 'hg rollback' удалит последнюю транзакцию. Транзакции - это концепция, которая часто встречается в базах данных. В Mercurial мы начинаем транзакцию при выполнении определенных операций, таких как фиксация, push, pull ...
    Когда операция завершается успешно, транзакция отмечена как полная. Если возникает ошибка, транзакция «откатывается», и репозиторий остается в том же состоянии, что и раньше.
    Вы можете вручную вызвать откат с помощью «hg rollback». Это приведет к отмене последней транзакционной команды. Если команда pull принесла 10 новых наборов изменений в репозиторий на разных ветвях, то «hg rollback» удалит их все. Обратите внимание: есть без резервного копирования при откате транзакции!

  • 'hg strip' удалит набор изменений и все его потомки. Набор изменений сохраняется как комплект, который вы можете применить снова, если вы нуждаетесь в них .

ForeverWintr предлагает в комментариях (в 2016 году, спустя 5 лет)

Вы можете 'ип фиксации' файлы, сначала рт.ст. забывая их, например: hg forget filea; hg commit --amend, но кажется, что неинтуитивными ,
hg strip --keep, вероятно, лучшее решение для современных hg.

+0

Когда я понимаю, что исправление отката удаляет последнюю транзакцию. В моем случае я сделал фиксацию, затем я вытащил с сервера. Значит ли это, что я откажусь от вытаскивания вместо фиксации? –

+1

@Martin Buberl: Согласно http://www.selenic.com/mercurial/hg.1.html#rollback, pull считается транзакцией. Поэтому, если вы потянули, выполнение «hg rollback» отменит pull вместо фиксации. –

+0

Спасибо, я собираюсь изменить свой вопрос немного, чтобы указать, что лучше. –

5

hg rollback - это то, что вы хотите.

В TortoiseHg hg rollback выполнен в диалоговом окне фиксации. Откройте диалоговое окно фиксации и выберите «Отменить».

alt text

+1

Я сделал фиксацию, затем вытащил и обновил/синхронизировал. С этими новыми изменениями я решил, что мой последний фиксатор устарел и хочет его отменить. Кнопка «Отменить» в TortoiseHg отключена в моем случае. –

+0

Откат отменен. – UpTheCreek

+0

В текущей версии Tortoise HG вы можете перейти к опции Rollback/Undo из пункта меню репозитория. – daveywc

19

Поскольку вы не можете откатить вы должны объединить этот коммит в новую голову вы получили, когда вы вытащили. Если вы не хотите выполнять какую-либо работу, которую вы сделали, вы можете легко сделать это, используя this tip.

Так что, если вы тянули и обновлены до их голов вы можете сделать это:

hg --config ui.merge=internal:local merge 

сохраняет все изменения в настоящее время извлеченным пересмотра, и ни одно из изменений в не проверено -out revision (тот, который вы написали, что вы больше не хотите).

Это отличный способ сделать это, потому что он сохраняет вашу историю точной и полной. Если через 2 года кто-то найдет ошибку в том, что вы потянули, вы можете посмотреть в своей (неиспользуемой, но сохраненной) реализации того же самого и пойти «о, я сделал это правильно». :)

42

hg strip полностью удалит ревизию (и любые потомки) из репозитория.

Чтобы использовать полосу вам необходимо установить MqExtension, добавив следующие строки в .hgrc (или Mercurial.ini):

[extensions] 
mq = 

В TortoiseHg команда полоса доступна в рабочей среде. Щелкните правой кнопкой мыши на ревизии и выберите «Изменить историю» -> «Стрип».

С strip изменяет историю хранилища, которую вы должны использовать только в версиях, которые еще не были доступны никому. Если вы используете Mercurial 2.1+, вы можете использовать phases для отслеживания этой информации. Если фиксация все еще находится в стадии проекта, она не была передана другим репозиториям, поэтому вы можете спокойно ее удалить. (Спасибо Засурусу за это указание).

+2

ЕСЛИ данная ревизия все еще находится в черновике фразы (или у вас есть доступ ко ВСЕМ РЕПО, к которому он был нажат/вытащил и применил полосу к каждому из них) (что имеет место в этом описании), тогда это является sooo лучшим и самым чистым вариантом. – GazB

+4

Если у вас установлен TortoiseHg, есть графический интерфейс для глобальной активации mq. В текущей версии: включите «file-> settings-> глобальные настройки вкладки-> расширения-> mq» или просмотрите файл настроек с помощью кнопки «Редактировать файл». – David

0

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

0

Обходной путь.

Если вы не нажмете на сервер, вы будете клонировать в новую папку вымывание (удалить все файлы) из папки вашего репозитория и клонировать новое.

Смежные вопросы