Mercurial: как изменить последний коммит?

Я ищу встречную часть git commit --amend в Mercurial, т. е. способ изменить фиксацию, с которой связана моя рабочая копия. Требования к этой процедуре внесения поправок являются следующими:

  • если это возможно, он не должен требовать каких-либо расширений. Он должен не требуют нестандартных расширений, т. е. расширения, которые не поставляются с официальной установкой Mercurial.

  • если commit to amend - один руководитель моей текущей ветви, нет новой главы должен быть создан. Если фиксация не является head, может быть создана новая head.

  • процедура должна быть безопасное таким образом, если по каким-либо причинам изменение не удастся, я хочу, чтобы была восстановлена та же рабочая копия и состояние репозитория, что и до изменения. Другими словами, если сама поправка может завершиться неудачей,должна существовать отказоустойчивая процедура восстановления состояния рабочей копии и хранилища. Я имею в виду " неудачи" которые лежат в природе процедуры изменения (например, конфликты), а не проблемы, связанные с файловой системой (например, ограничения доступа, невозможность заблокировать файл для записи,..)

обновление (1):

  • процедура должна быть automatable, поэтому он может быть выполнен клиентом GUI без какого-либо взаимодействия с пользователем.

обновление (2):

  • файлы в рабочей каталог не должен быть затронут (на некоторых измененных файлах могут быть блокировки файловой системы). Это особенно означает, что возможный подход может ни в коем случае не требовать чистого рабочего каталога.

6 ответов


с выделением ртутный 2.2 можно использовать с hg commit обновить последнюю фиксацию текущим рабочим каталогом

С ссылка на командную строку:

флаг --amend может использоваться для изменения родителя рабочего каталога с новой фиксацией, которая содержит изменения в родителе в дополнение к тем, которые в настоящее время сообщаются статусом hg, если таковые имеются. Старая фиксация хранится в резервный пакет внутри .HG / strip-backup (см. HG help bundle и HG help unbundle о том, как его восстановить).

сообщение, пользователь и дата берутся из измененного фиксации, если не указано. Если сообщение Не указано в командной строке, редактор откроется с сообщением измененной фиксации.

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


у вас есть 3 варианта редактирования коммитов в Mercurial:

  1. hg strip --keep --rev -1 отменить последний(1) commit (s), чтобы вы могли сделать это снова (см. ответ для получения дополнительной информации).

  2. С помощью расширение MQ, который поставляется с Mercurial

  3. даже если он не поставляется с Mercurial,Histedit расширение стоит упомянуть

вы также можете посмотрите на Редактирование Истории страница Mercurial wiki.

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

Я не очень хорошо знаком с git commit --amend command, но AFAIK, Histedit-это то, что кажется самым близким, но, к сожалению, оно не поставляется с Mercurial. MQ-это реально сложны в использовании, но вы можете делать почти все что угодно.


эквивалент GUI для hg commit --amend:

Это также работает с GUI TortoiseHG (я использую v2.5):

Swich в представлении "фиксация" или в представлении верстака выберите запись "рабочий каталог". Кнопка "фиксация" имеет опцию "изменить текущую ревизию" (нажмите стрелку раскрывающегося списка кнопки, чтобы найти ее).

enter image description here

          ||
          ||
          \/

enter image description here

будьте осторожны emptor:

это дополнительная опция будет включен, только если версия mercurial по крайней мере 2.2.0, и если текущая редакция не является общедоступной, не является исправлением и не имеет дети. [...]

нажатие кнопки вызова 'commit --amend 'to' amend ' The revision.

подробнее об этом на канале THG dev


предполагая, что вы еще не распространяются изменения, вот что вы можете сделать.

  • добавить в свою .hgrc:

    [extensions]
    mq =
    
  • в репозитории:

    hg qimport -r0:tip
    hg qpop -a
    

    конечно, вам не нужно начинать с нулевой версии или поп все патчи, для последнего только один поп (hg qpop) достаточно (см. ниже).

  • удалить последнюю запись в .hg/patches/series файл или патчи, которые вам не нравятся. Переупорядочивание тоже возможно.

  • hg qpush -a; hg qfinish -a
  • удалить .diff файлы (неприменимые исправления) все еще внутри .hg / patches (должен быть один в вашем случае).

если вы не хочу to забрать все ваш патч, вы можете редактировать его с помощью 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.

конечно, эта процедура очень обескуражен и рискован. сделать резервную копию всего, прежде чем вы это сделаете!

как sidenote, я делал это миллионы раз на частных репозиториях.


я настраиваюсь на то, что написал krtek. Более конкретно решение 1:

предположения:

  • вы совершили один (!) changeset, но еще не нажали его
  • вы хотите изменить этот набор изменений (например, добавить, удалить или изменить файлы и/или сообщение фиксации)

устранение:

  • использовать hg rollback отменить последнюю фиксацию
  • снова с новыми изменениями в место

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


последние версии Mercurial включают evolve расширение, которое предоставляет . Это позволяет изменять фиксацию без потери предварительной истории изменений в вашем элементе управления версиями.

hg изменить [вариант]... [ПАПКА.]..

псевдонимы: обновление

объедините набор изменений с обновлениями и замените его новым

Commits a new changeset incorporating both the changes to the given files
and all the changes from the current parent changeset into the repository.

See 'hg commit' for details about committing changes.

If you don't specify -m, the parent's message will be reused.

Behind the scenes, Mercurial first commits the update as a regular child
of the current parent. Then it creates a new commit on the parent's
parents with the updated contents. Then it changes the working copy parent
to this new combined changeset. Finally, the old changeset and its update
are hidden from 'hg log' (unless you use --hidden with log).

посмотреть https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve для полного описания