Mercurial отменить последний коммит
Как я могу отменить мою последнюю случайно внесенную (не выдвинутую) замену в Mercurial?
Если это возможно, предпочтительнее использовать TortoiseHg.
Обновить
В моем конкретном случае я совершил набор изменений (не нажал). Затем я вытащил и обновил с сервера. С этими новыми обновлениями я решил, что мой последний коммит устарел и я не хочу его синхронизировать. Похоже, что hg rollback
это не совсем то, что я ищу, потому что это откатило бы тягу вместо моего коммита.
9 ответов
Один из способов был бы (по состоянию на август 2013 г. устарело)hg rollback
Пожалуйста, используйте
hg commit --amend
вместоrollback
исправить ошибки в последнем коммите.Откат последней транзакции в репозитории.
При фиксации или слиянии Mercurial добавляет запись набора изменений последним.
Mercurial ведет журнал транзакций по имени каждого файла и его длине до транзакции. При прерывании он усекает каждый файл до его предыдущей длины. Эта простота является одним из преимуществ создания дополнений в журналах. Журнал транзакций также позволяет отменить операцию.
Смотрите раздел Восстановление TortoiseHg:
Эта тема также подробно описывает разницу между hg rollback
а также hg strip
:
(написано Martin Geisler, который также участвует в SO)
'
hg rollback
'удалит последнюю транзакцию. Транзакции - это концепция, часто встречающаяся в базах данных. В Mercurial мы запускаем транзакцию, когда выполняются определенные операции, такие как commit, push, pull...
После успешного завершения операции транзакция помечается как завершенная. Если возникает ошибка, транзакция "откатывается", а хранилище остается в том же состоянии, что и раньше.
Вы можете вручную выполнить откат с помощью "hg rollback". Это отменит последнюю транзакционную команду. Если команда pull принесла 10 новых наборов изменений в хранилище в разных ветвях, то 'hg rollback
'удалит их всех. Обратите внимание: при откате транзакции резервное копирование не производится!'
hg strip
'удалит ревизию и всех ее потомков. Наборы изменений сохраняются в виде пакета, который вы можете применить снова, если они вам понадобятся.
ForeverWintr предлагает в комментариях (в 2016 году, 5 лет спустя)
Вы можете "снять фиксацию" с файлов, сначала забыв их, например:
hg forget filea; hg commit --amend
, но это кажется не интуитивным.hg strip --keep
это, вероятно, лучшее решение для современной HG.
hg strip
полностью удалит ревизию (и всех потомков) из хранилища.
Чтобы использовать strip, вам нужно установить MqExtension, добавив следующие строки в ваш.hgrc (или mercurial.ini):
[extensions]
mq =
В TortoiseHg команда strip доступна в рабочей среде. Щелкните правой кнопкой мыши по ревизии и выберите "Изменить историю" -> "Полоска".
поскольку strip
изменяет историю репозитория, вы должны использовать его только в тех ревизиях, которые еще никому не передавались. Если вы используете Mercurial 2.1+, вы можете использовать фазы для отслеживания этой информации. Если коммит все еще находится на стадии черновика, он не был передан другим хранилищам, поэтому вы можете безопасно удалить его. (Спасибо Засурусу за то, что указал на это).
Поскольку вы не можете выполнить откат, вы должны объединить этот коммит с новой головой, которую вы получили, когда потянули. Если вам не нужна какая-либо работа, которую вы выполняли в ней, вы можете легко сделать это, используя этот совет.
Так что, если вы потянули и обновили их голову, вы можете сделать это:
hg --config ui.merge=internal:local merge
сохраняет все изменения в текущей проверенной ревизии и ни одно из изменений в не проверенной ревизии (той, которую вы написали, которая вам больше не нужна).
Это отличный способ сделать это, потому что он сохраняет вашу историю точной и полной. Если через 2 года кто-то обнаружит ошибку в том, что вы сняли, вы можете посмотреть в своей (неиспользованной, но сохраненной) реализации того же самого и пойти: "О, я сделал это правильно".:)
hg rollback
это то, что вы хотите.
В Черепахе, hg rollback
выполняется в диалоге фиксации. Откройте диалог фиксации и выберите "Отменить".
Я считаю, что более современный и простой способ сделать это сейчас -
hg uncommit
. Обратите внимание, что при этом остается пустая фиксация, которая может быть полезна, если вы хотите повторно использовать сообщение фиксации позже. Если вы этого не сделаете, используйте
hg uncommit --no-keep
чтобы не оставлять пустую фиксацию.
hg uncommit [ОПЦИЯ]... [ФАЙЛ]...
отменить фиксацию части или всего локального набора изменений
This command undoes the effect of a local commit, returning the affected files to their uncommitted state. This means that files modified or deleted in the changeset will be left unchanged, and so will remain modified in the working directory. If no files are specified, the commit will be left empty, unless --no-keep
Извините, я не уверен, что эквивалентно TortoiseHg.
Я столкнулся с этой проблемой недавно, хотя моя ситуация была немного другой - я уже нажал коммит, который хотел отменить. Я решил свою проблему с
hg backout <revision-code>
. Вроде работает аналогично. Из этого ответа :
backout
: создать новую фиксацию, которая является инверсией данной фиксации. Чистый эффект - это отмена, но изменение остается в вашей истории.
В TortiseHg это можно сделать, щелкнув правой кнопкой мыши фиксацию, которую вы хотите отменить, и выбрав
Backout...
. Документ TortiseHg здесь .
Я думаю, что есть аргумент в пользу создания новой отмены фиксации вместо полного удаления предыдущей фиксации. Из этой статьи о
git revert
:
Вместо того, чтобы удалять фиксацию из истории проекта, он выясняет, как инвертировать изменения, внесенные фиксацией, и добавляет новую фиксацию с результирующим обратным содержимым. Это предотвращает потерю истории Git, что важно для целостности вашей истории изменений и для надежной совместной работы.
Это обходной путь.
Если вы не нажмете на сервер, вы клонируете в новую папку, иначе вымываете (удаляете все файлы) из вашей папки репозитория и клонируете новую.
После того, как вы извлекли и обновили свое рабочее пространство, сделайте thg и щелкните правой кнопкой мыши на наборе изменений, от которого вы хотите избавиться, и затем нажмите изменить историю -> полоса, это удалит набор изменений и вы увидите подсказку по умолчанию.