Есть ли способ удалить локальные коммиты в 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
на ней и выбрав:
Точно так же:
![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