Mercurial отменить последнюю фиксацию

125

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

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

Обновить

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

Мартин Буберль
источник
1
А как насчет того, чтобы сделать два hg rollbackи снова потянуть?
VonC
1
Первый откат отменяет откат, второй откат сообщает мне, что «информация об откате недоступна».
Мартин Буберл
1
Я столкнулся с такой же ситуацией, и, насколько мне известно, после того, как вы выполнили любую другую операцию, вы не можете вернуться или удалить ее из истории. Вам нужно будет повторно клонировать репозиторий hg.
3
strip --keep: stackoverflow.com/questions/29413851/… напрямую решает задачу, как и MQ qimport. В качестве альтернативы, может быть лучше просто rebaseв сценарии, если локальные изменения также должны быть сохранены и нет конфликта. (Используйте слияние, чтобы сохранить некоторые объединенные изменения из обеих ветвей, когда это желаемая конечная цель графа, особенно в случае, не связанном с fastforward.) Также может быть допустимым просто закрыть ветвь, которая по-прежнему «сохраняет историю» (но иначе, чем слияние) в зависимости от желаемого конечного состояния.
user2864740 06
2
Как @ user2864740 говорит, hg strip --keepэто команда сделать использование, но вы должны обеспечить пересмотр, например: hg strip --keep -r .. Этот ответ хорошо объясняет stackoverflow.com/a/19064016/1286571
ForeverWintr 01

Ответы:

77

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

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

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

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

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

альтернативный текст

В этой ветке также подробно описывается разница между hg rollbackи hg strip:
(написано Мартином Гейслером, который также участвует в 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наверное лучшее решение для современной рт.

VonC
источник
Когда я понимаю, что правильно, откат удаляет последнюю транзакцию. В моем случае я сделал фиксацию, а затем снял с сервера. Итак, означает ли это, что я бы откатил тягу вместо фиксации?
Мартин Буберл
1
@Martin Buberl: Согласно selenic.com/mercurial/hg.1.html#rollback , pull считается транзакцией. Так что, если вы вытащили, выполнение hg rollbackотменяет извлечение вместо фиксации.
Тим Хениган
2
Я не уверен, как hg commit --amendэто должно работать, но для меня это дало мне редактор для изменения сообщения о фиксации и не было способа изменить, какие файлы были включены. Я вышел из редактора без сохранения и обнаружил, что моя ошибочная фиксация была изменена, чтобы включить ВСЕ измененные файлы!
Тим Тисдалл,
2
Мне не понятно, как ответить на вопрос, используя hg commit --amend. Вы можете «отменить фиксацию» файлов, предварительно hg forgetпометив их, например:, hg forget filea; hg commit --amendно это кажется неинтуитивным. hg strip --keep , вероятно, лучшее решение для современной hg.
ForeverWintr 02
1
@JasonS book.mercurial-scm.org/read/… - это хорошее чтение, хотя в вашем случае вы также можете подумать о сбросе hg: stackoverflow.com/a/31302998/6309
VonC
46

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

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

[extensions]
mq =

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

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

Питер Грэм
источник
2
ЕСЛИ рассматриваемая ревизия все еще находится в черновой фразе (или у вас есть доступ ко ВСЕМ репозиториям, к которым она была отправлена ​​/ вытягивалась, и применить полосу ко всем из них) (как в этом описании), то это ооочень лучший и чистый вариант.
GazB
4
Если у вас установлен TortoiseHg, есть графический интерфейс для глобальной активации mq. В текущей версии: включите «файл-> настройки-> вкладка глобальных настроек-> расширения-> mq» или войдите в файл настроек через кнопку «Редактировать файл».
Дэвид
19

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

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

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

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

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

Ry4an Brase
источник
5

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

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

альтернативный текст

Тим Хениган
источник
1
Я сделал фиксацию, затем извлек и обновил / синхронизировал. С этими новыми изменениями я решил, что моя последняя фиксация устарела, и хочу ее отменить. В моем случае кнопка «Отменить» в TortoiseHg отключена.
Мартин Буберл
Откат больше не рекомендуется.
UpTheCreek
В текущей версии Tortoise HG вы можете перейти к опции Откат / Отменить из пункта меню Репозиторий.
daveywc
Требуется ссылка на @UpTheCreek.
DanMan
@DanMan - проверьте ссылку, которую он предоставил.
UpTheCreek
3

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

TmTron
источник
1

Его обходной путь.

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

ITsDEv
источник
0

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

cabhishek
источник