Есть ли способ удалить локальные коммиты в Mercurial? - PullRequest
200 голосов
/ 26 февраля 2010

Так что я продолжаю делать глупую ошибку в Mercurial. Часто я начинаю работать без "hg pull" и "hg update". Когда я пытаюсь выдвинуть свои изменения, я получаю сообщение об ошибке.

Есть ли способ удалить мои локальные коммиты , чтобы я мог избежать создания нескольких головок, веток и т. Д.? Я просто хочу удалить свои локальные коммиты, объединить мои изменения с подсказкой, а затем повторно зафиксировать. Звучит просто, правда? Кажется, я не могу найти способ легко удалить локальные коммиты , чтобы я мог аккуратно слиться с подсказкой.

Опять же, я только пытаюсь удалить локальные коммиты, сделанные с помощью "hg ci". Я не хочу изменять файлы, возвращать их и т. Д.

Ответы [ 8 ]

231 голосов
/ 01 июля 2011

Включите расширение " strip " и введите следующее:

hg strip #changeset# --keep

Где #changeset# - хэш для набора изменений, который вы хотите удалить. Это удалит указанный набор изменений , включая наборов изменений, которые происходят от него , и оставит ваш рабочий каталог нетронутым . Если вы также хотите отменить внесенные вами изменения кода, удалите опцию --keep.

Для получения дополнительной информации, проверьте Удлинитель полосы .

Если вы получили «неизвестную команду« Газа »», вам может потребоваться ее включить. Для этого найдите файл .hgrc или Mercurial.ini и добавьте в него следующее:

[extensions]
strip =

Обратите внимание, что (как Юозас упомянул в своем комментарии) наличие нескольких голов является нормальным рабочим процессом в Mercurial. Вы не должны использовать команду полосы, чтобы бороться с этим. Вместо этого вы должны объединить свою голову с входящей головой, разрешить все конфликты, протестировать и затем нажать кнопку.

Команда strip полезна, когда вы действительно хотите избавиться от наборов изменений, которые загрязняют ветку. Фактически, если вы находитесь в ситуации этого вопроса и хотите полностью удалить все "черновые" наборы изменений навсегда, посмотрите верхний ответ, который в основном предлагает сделать:

hg strip 'roots(outgoing())'
92 голосов
/ 28 ноября 2014

Если вы используете Hg Tortoise, просто активируйте расширение " strip " в:

  1. Файл / Настройки / Extensions /
  2. Выберите полоса

Затем выберите нижнюю ревизию, с которой вы хотите начать чередование, выполнив для нее right click и выбрав:

  1. История изменений
  2. Газа

Так же, как это:

enter image description here

В этом примере он будет удален с 19-й ревизии до последней подтвержденной (22).

19 голосов
/ 20 августа 2013

Современный ответ (актуален только после Mercurial 2.1):

Используйте Phases и отметьте ревизии, которые вы не хотите передавать как секретные (приватные). Таким образом, когда вы нажимаете, они не будут отправлены.

В TortoiseHG вы можете щелкнуть правой кнопкой мыши на коммите, чтобы изменить его фазу.

Также: Вы также можете использовать расширение «rebase» для перемещения ваших локальных коммитов в начало общего репозитория после того, как вы извлечете.

14 голосов
/ 26 февраля 2010

Как и все остальные, вы, вероятно, должны просто потянуть и затем объединить головы, но если вы действительно хотите избавиться от ваших коммитов без какого-либо инструмента EditingHistory , тогда вы можете просто hg clone -r ваш репо, чтобы получить все, кроме этих изменений.

Это не удаляет их из исходного репозитория, но создает новый клон, у которого их нет. Затем вы можете удалить репо, которое вы изменили (если хотите).

9 голосов
/ 14 августа 2015

Я тоже сталкивался с этой проблемой. Я сделал 2 commit и хотел откатить и удалить оба коммита.

$ hg rollback

Но hg rollback просто откатывается до последнего коммита, а не 2 коммитов. В то время я не осознавал этого и изменил код.

Когда я обнаружил, что hg rollback только что откатил один коммит, я обнаружил, что могу использовать hg strip #changeset#. Итак, я использовал hg log -l 10, чтобы найти последние 10 коммитов и получить нужную ревизию, которую я хотел strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

Что означает abort: local changes found? Это означает, что hg обнаружил изменения в коде, которые еще не были зафиксированы. Итак, чтобы решить эту проблему, вы должны hg diff сохранить код, который вы изменили, и hg revert и hg strip #changeset#. Просто так:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

После того как вы сделали выше, вы можете patch файл diff и ваш код можно добавить обратно в ваш проект.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
9 голосов
/ 26 февраля 2010

Вы можете обойти это еще проще с расширением Rebase , просто используйте hg pull --rebase, и ваши коммиты автоматически перенаправляются на вытащенную ревизию, избегая проблемы ветвления.

5 голосов
/ 29 августа 2014

Если вы знакомы с git, вы будете рады использовать histedit , который работает как git rebase -i.

4 голосов
/ 03 ноября 2017

hg strip - это то, что вы ищете. Это аналог git reset, если вы знакомы с git.

Использовать консоль:

  1. Вам необходимо знать номер редакции. hg log -l 10. Эта команда показывает последние 10 коммитов. Найдите коммит, который вы ищете. Вам нужен 4-значный номер из строки изменений changeset: 5888:ba6205914681

  2. Тогда hg strip -r 5888 --keep. Это удаляет запись фиксации, но сохраняет все файлы измененными, а затем вы можете повторно их подтвердить. (если вы хотите удалить файлы, просто удалите --keep hg strip -r 5888

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...