Как удалить коммит в Mercurial?

Я хочу полностью удалить коммит Mercurial, как будто он никогда не был введен в репозиторий, и вернуться к моему предыдущему коммиту.

Это возможно?

9 ответов

Если это был ваш последний коммит и вы нигде не нажимали его, вы можете сделать это с rollback, В противном случае нет. На самом деле, нет. Время менять свои пароли.

Изменить: было отмечено, что вы можете клонировать из более ранней ревизии и объединить изменения, которые вы хотите сохранить. Это также верно, если вы не выдвинули его в репо, который вы не контролируете. После того, как вы нажмете, ваши данные, скорее всего, будет очень трудно вернуть.

Вы можете попытаться удалить mq информацию о вашем коммите.

  • Для этого вам нужно зайти Файл-> Настройки-> Расширения.
  • Там проверь mq и перезагрузи графический интерфейс.
  • После этого просто щелкните правой кнопкой мыши на ненужном коммите и ModifyHistory->Strip

Для редактирования истории я бы использовал расширение Histedit.

 hg histedit 45:c3a3a271d11c

Однако имейте в виду, что это имеет смысл только в ситуации, когда вы еще не отправили коммиты в публичный репозиторий, у вас есть общедоступный репозиторий и / или вы можете отчитаться за все клоны. Если вы получили следующую ошибку:

abort: can't rebase immutable changeset 43ab8134e7af

Это означает, что Mecurial считает, что это общедоступный набор изменений (см. Этапы), который уже выдвинут - вы можете заставить его быть draft снова делаем:

hg phase -f -d 45:c3a3a271d11c

Я сталкиваюсь с этим довольно часто. Я делаю коммит, а затем тяну, чтобы нажать. Но потом приходит что-то, что делает мой недавно сделанный коммит ненужным. Равнина hg rollback недостаточно, потому что это только отменяет тягу...

Это то, что нужно сделать:

hg strip <rev>

Вещи безболезненны, когда вы никуда не толкаете свои ревизии.

Если это более одного коммита и / или вы уже отправили его куда-то еще, вы можете клонировать свой репозиторий и указать последний набор изменений, который должен быть клонирован.

Смотрите мой ответ здесь, как это сделать:
Mercurial: исправление поврежденной истории

Если вы зафиксировали только локально и не выполняли push, вы можете просто создать клон локально (как описано в моей ссылке), и все готово.

Если вы уже отправили в какой-либо удаленный репозиторий, вам придется заменить его своим клоном.
Конечно, это зависит от того, можете ли вы (или можете) сделать это.

Вы можете использовать "hg backout", чтобы сделать обратное слияние в принципе. Все варианты обсуждаются в свободно доступной книге "Mercurial: полное руководство":

http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html

Если вы используете черепаху, вы можете использовать изменить историю> полосы...

В 2022 году я используюevolveрасширение. Это одно из лучших расширений для этой цели.

Кpruneнежелательный набор изменений, если вы, например, сделали быстрый взлом, чтобы заставить код работать:

      $ echo 'debug hack' >> file1.c
$ hg commit -m 'debug hack'

Теперь у вас есть правильный патч, который вы можете сделатьhg prune .:

      $ hg prune .
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
working directory is now at 2a39221aaebb
1 changesets pruned

Если вы отправите изменение в удаленный репозиторий, вы найдете толькоobsolescenceмаркеры:

      $ hg push
searching for changes                          
no changes found                               
remote: 1 new obsolescence markers             

Чтобы проверить изменения в вашем локальном репо, вы можетеpullиз удаленного:

      $ hg pull                            
pulling from ssh://userid@server/repo
searching for changes      
no changes found

Да. Если я не ошибаюсь, с v2.3 (отн. 2012/08/01) вы можете использовать HisteditExtension сdrop Команда для удаления коммита, наряду с strip или же backout удалить изменения.

Простой поиск Google по этой функции: https://www.google.com/webhp

Другие вопросы по тегам