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



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




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


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


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



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




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


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




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

841   6  

6 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

Это также работает с графическим интерфейсом TortoiseHG (я использую v2. 5):

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

enter image description here

          ||
          ||
          \/

enter image description here

предостережение emptor:

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

нажатие кнопки вызова 'выб ... изменить" в "Изменить' пересмотр.

подробнее об этом на канале 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 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.

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

в качестве побочного Примечания, я сделал это миллионы раз на частных хранилищах.

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

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

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

устранение:

  • использовать 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 для полного описания

Comments

    Ничего не найдено.