Я ищу git commit --amend
аналог Mercurial, то есть способ изменить коммит, с которым связана моя рабочая копия. Меня интересует только последний коммит, а не произвольный ранний коммит.
Требования к этой процедуре внесения поправок:
по возможности, он не должен требовать каких-либо расширений. Он не должен требовать расширений не по умолчанию , то есть расширений, которые не поставляются с официальной установкой Mercurial.
если обязательство изменить - один из моих нынешних филиалов, новый руководитель создавать не следует. Если коммит не является головой, может быть создан новый руководитель.
процедура должна быть безопасной, так что если по каким-либо причинам изменение не удастся, я хочу восстановить ту же рабочую копию и состояние хранилища, что и до внесения изменений. Другими словами, если само изменение может потерпеть неудачу, должна существовать отказоустойчивая процедура для восстановления рабочей копии и состояния хранилища. Я имею в виду «сбои», которые лежат в природе процедуры внесения изменений (например, конфликты), а не проблемы, связанные с файловой системой (например, ограничения доступа, невозможность заблокировать файл для записи, ... )
Обновление (1):
- процедура должна быть автоматизируемой , поэтому она может выполняться клиентом с графическим интерфейсом без какого-либо вмешательства пользователя.
Обновление (2):
- файлы в рабочем каталоге не должны быть затронуты (могут быть блокировки файловой системы на некоторых измененных файлах). Это особенно означает, что возможный подход ни в коем случае не может потребовать чистого рабочего каталога.
источник
У вас есть 3 варианта редактирования коммитов в Mercurial:
hg strip --keep --rev -1
отмените последний (1) коммит (ы), так что вы можете сделать это снова (см. этот ответ для получения дополнительной информации).Использование расширения MQ , которое поставляется с Mercurial
Даже если он не поставляется с Mercurial, расширение Histedit стоит упомянуть
Вы также можете посмотреть страницу истории редактирования вики Mercurial.
Короче говоря, редактирование истории действительно сложно и не рекомендуется . И если вы уже отодвинули свои изменения, вы ничего не можете сделать, кроме как, если вы полностью контролируете все остальные клоны.
Я не очень знаком с
git commit --amend
командой, но AFAIK, Histedit - то, что кажется самым близким подходом, но, к сожалению, оно не поставляется с Mercurial. MQ действительно сложен в использовании, но вы можете делать с ним почти все.источник
hg revert myfile
чтобы отменить удаление. Возможно повторное добавление сhg add
файлом после того, какrollback
работает.GUI эквивалент для
hg commit --amend
:Это также работает из графического интерфейса TortoiseHG (я использую v2.5):
Перейдите к представлению «Зафиксировать» или в представлении рабочей среды выберите запись «Рабочий каталог». Кнопка «Подтвердить» имеет параметр «Изменить текущую редакцию» (нажмите на стрелку раскрывающегося списка кнопки, чтобы найти ее).
Будьте бдительны :
Подробнее об этом на канале разработчиков THG
источник
Я настраиваюсь на то, что написал krtek. Более конкретно решение 1:
Предположения:
Решение:
hg rollback
для отмены последнего коммитаОткат действительно отменяет последнюю операцию. Его способ работы довольно прост: обычные операции в HG будут добавлять только файлы; это включает в себя фиксацию. Mercurial отслеживает длины файлов последней транзакции и поэтому может полностью отменить один шаг, урезав файлы до их старых длин.
источник
Предполагая, что вы еще не распространили свои изменения, вот что вы можете сделать.
Добавьте к вашему .hgrc:
В вашем хранилище:
Конечно, вам не нужно начинать с нулевой ревизии или извлекать все патчи, поскольку достаточно только одного pop (
hg qpop
) (см. Ниже).удалите последнюю запись в
.hg/patches/series
файле или патчи, которые вам не нравятся. Переупорядочение тоже возможно.hg qpush -a; hg qfinish -a
.diff
файлы (не примененные исправления), все еще в .hg / patches (должен быть один в вашем случае).Если вы не хотите , чтобы забрать все из вашего патча, вы можете редактировать его с помощью
hg qimport -r0:tip
(или аналогичный), а затем редактировать материал и использоватьhg qrefresh
для слияния изменений в верхний патч на свой стек. Читатьhg help qrefresh
.Редактируя
.hg/patches/series
, вы можете даже удалить несколько патчей или изменить их порядок. Если ваша последняя ревизия 99, вы можете просто использоватьhg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a
.Конечно, эта процедура крайне не рекомендуется и рискованно . Сделайте резервную копию всего, прежде чем сделать это!
Как примечание, я делал это миллионы раз на частных репозиториях.
источник
hg qfold
, кстатиhg import -r<prev>:tip
. Жаль, что нет ярлыка для предыдущей версии, как в Subversion.Последние версии Mercurial включают
evolve
расширение, которое предоставляетhg amend
команду. Это позволяет вносить изменения в коммит, не теряя предыдоговую историю в вашем контроле версий.См. Https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve для полного описания
evolve
расширения.источник
Может не решить всех проблем в первоначальном вопросе, но, поскольку это, похоже, фактический пост о том, как mercurial может изменить предыдущую фиксацию, я добавлю информацию на 2 цента.
Если вы похожи на меня и хотите изменить только предыдущее сообщение о фиксации (исправить опечатку и т. Д.) Без добавления каких-либо файлов, это будет работать
Без шаблонов включения или исключения
hg commit
по умолчанию будут включены все файлы в рабочем каталоге. Применение шаблона-X 'glob:**'
исключит все возможные файлы, позволяя только изменять сообщение коммита.Функционально это то же самое,
git commit --amend
когда нет файлов в индексе / сцене.источник
Другим решением может быть использование
uncommit
команды для исключения конкретного файла из текущего коммита.hg uncommit [file/directory]
Это очень полезно, если вы хотите сохранить текущий коммит и отменить выбор некоторых файлов из коммита (особенно полезно, если
files/directories
они были удалены).источник