Mercurial отменить последний коммит - PullRequest
121 голосов
/ 21 января 2011

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

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

Обновить

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

Ответы [ 7 ]

72 голосов
/ 21 января 2011

В одну сторону будет hg rollback (устарело с Hg2.7, август 2013 г.)

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

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

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

См. Раздел восстановления TortoiseHg :

alt text

В этой теме также подробно описана разница между hg rollback и hg strip:
(написано Мартином Гейслером , который также участвует в SO)

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

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

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

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

44 голосов
/ 07 июня 2011

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

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

[extensions]
mq =

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

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

19 голосов
/ 21 января 2011

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

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

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

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

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

5 голосов
/ 21 января 2011

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

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

alt text

2 голосов
/ 25 июля 2018

В текущей версии TortoiseHg Workbench 4.4.1 (07.2018) вы можете использовать Repository - Rollback/undo...:
enter image description here

0 голосов
/ 24 сентября 2016

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

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

0 голосов
/ 08 августа 2011

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

...