Поэтому я продолжаю делать глупую ошибку в Mercurial. Часто я начинаю работать без «hg pull» и «hg update». Когда я пытаюсь выдвинуть свои изменения, я получаю сообщение об ошибке.
Есть ли способ удалить мои локальные коммиты, чтобы избежать создания нескольких головок, веток и т. Д.? Я просто хочу удалить свои локальные коммиты, объединить мои изменения с подсказкой, а затем повторно зафиксировать. Звучит просто, правда? Кажется, я не могу найти способ легко удалить локальные коммиты, чтобы я мог слиться с подсказкой.
Опять же, я только пытаюсь удалить локальные коммиты, сделанные с помощью "hg ci". Я не хочу изменять файлы, возвращать и т. Д.
Ответы:
Включите расширение « strip » и введите следующее:
Где
#changeset#
хеш для ревизии, которую вы хотите удалить. Это удалит указанный набор изменений, включая наборы изменений, которые происходят от него, и оставит ваш рабочий каталог без изменений . Если вы также хотите отменить внесенные вами изменения кода, снимите эту--keep
опцию.Для получения дополнительной информации, проверьте расширение полосы .
Если вы получили «неизвестную команду 'strip'", вам может потребоваться ее включить. Для этого найдите файл
.hgrc
илиMercurial.ini
и добавьте в него следующее:Обратите внимание, что (как Юозас упомянул в своем комментарии) наличие нескольких головок - нормальный рабочий процесс в Mercurial. Вы не должны использовать команду полосы, чтобы бороться с этим. Вместо этого вы должны объединить свою голову с входящей головой, разрешить все конфликты, проверить и затем нажать кнопку.
Команда
strip
полезна, когда вы действительно хотите избавиться от наборов изменений, которые загрязняют ветку. На самом деле, если вы находитесь в ситуации с этим вопросом и хотите полностью удалить все «черновые» наборы изменений , ознакомьтесь с основным ответом , который в основном предлагает сделать следующее:источник
strip =
все в порядке. WhatsNew для Mercurial 2.8Если вы используете Hg Tortoise, просто активируйте расширение " strip " в:
Затем выберите нижнюю ревизию, с которой вы хотите начать чередование, выполнив
right click
ее и выбрав:Именно так:
В этом примере он будет удален с 19-й ревизии до последней подтвержденной (22).
источник
File/Settings/Extensions/
Я хотел бы добавить больше голосов. Большое спасибо!--keep
и TortoiseHg не дает такой возможности. Итак ... вам нужно сделать это в командной строке сhg strip -r . --keep
.Современный ответ (актуален только после Mercurial 2.1):
Используйте Фазы и отметьте ревизию (и), которую вы не хотите передавать как секретную (приватную). Таким образом, когда вы нажимаете, они не будут отправлены.
В TortoiseHG вы можете щелкнуть правой кнопкой мыши на коммите, чтобы изменить его фазу.
Также: Вы также можете использовать расширение «rebase» для перемещения ваших локальных коммитов в заголовок общего репозитория после того, как вы извлекаете.
источник
Как и все остальные, вы, вероятно, должны просто потянуть и затем объединить головы, но если вы действительно хотите избавиться от ваших коммитов без каких- либо инструментов EditingHistory , то вы можете просто
hg clone -r
репо, чтобы получить все, кроме этих изменений.Это не удаляет их из исходного репозитория, но создает новый клон, у которого их нет. Затем вы можете удалить репо, которое вы изменили (если хотите).
источник
Я тоже сталкивался с этой проблемой. Я сделал 2
commit
и хотел откатить и удалить оба коммита.Но
hg rollback
просто откат до последнего коммита, а не 2 коммитов. В то время я не осознавал этого и изменил код.Когда я обнаружил,
hg rollback
что только что откатил один коммит, я обнаружил, что могу использоватьhg strip #changeset#
. Итак, я обычноhg log -l 10
находил последние 10 коммитов и получал нужную ревизию, которую хотелstrip
.Что
abort: local changes found
значит? Это означает, чтоhg
найдены изменения в коде, которые еще не были зафиксированы. Итак, чтобы решить эту проблему, вы должныhg diff
сохранить код, который вы изменили иhg revert
иhg strip #changeset#
. Именно так:После того, как вы сделали вышеупомянутое, вы можете
patch
добавить файл diff и ваш код обратно в ваш проект.источник
Вы можете обойти это еще проще с расширением Rebase , просто используйте его,
hg pull --rebase
и ваши коммиты автоматически перенаправляются на вытащенную ревизию, избегая проблемы ветвления.источник
Если вы знакомы с git, вы будете рады использовать histedit, который работает как
git rebase -i
.источник
hg strip
это то, что вы ищете. Это аналогично тому,git reset
если вы знакомы с git.Используйте консоль:
Вам нужно знать номер ревизии.
hg log -l 10
, Эта команда показывает последние 10 коммитов. Найдите коммит, который вы ищете. Вам нужен 4-значный номер из строки измененийchangeset: 5888:ba6205914681
Потом
hg strip -r 5888 --keep
. Это удаляет запись фиксации, но сохраняет все файлы измененными, а затем вы можете повторно их подтвердить. (если вы хотите удалить файлы, просто удалите --keephg strip -r 5888
источник
[Черепаха 4.6.1] Если это последнее действие, вы можете использовать действие «Откат / Отмена» (Ctrl + U).
источник
В дополнение к превосходному ответу Самаурсы, вы можете использовать
evolve
расширенияprune
как безопасную и восстанавливаемую версиюstrip
, которая позволит вам вернуться в случае, если вы делаете что-то не так.У меня есть эти псевдоним на моем
.hgrc
:Обратите внимание , что
prune
также--keep
, как иstrip
, чтобы сохранить рабочий каталог нетронутым позволяет подтвердить файлы.источник