Есть ли способ удалить локальные коммиты в Mercurial?

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

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

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

Ответ 1

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

hg strip #changeset#

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

Для получения дополнительной информации проверьте Strip Extension.

Если вы получите "unkown command 'strip", вам может понадобиться включить его. Для этого найдите файл .hgrc или Mercurial.ini и добавьте в него следующее:

[extensions]
mq = 

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

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

hg strip 'roots(outgoing())'

Ответ 2

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

  • Файл/Настройки/Extensions/
  • Выберите mq

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

  • Изменить историю
  • Strip

Точно так же:

enter image description here

В этом примере он стирается с 19-й ревизии до последней, прошедшей (22).

Ответ 3

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

Ответ 4

Современный ответ (относится только к Mercurial 2.1):

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

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

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

Ответ 5

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

Ответ 6

Я тоже столкнулся с этой проблемой. Я сделал 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<[email protected]>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<[email protected]>
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

Ответ 7

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

Ответ 8

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

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

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

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