Mercurial: как внести поправки в последнюю фиксацию?

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

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

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

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

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

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

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

  • файлы в рабочем каталоге не должны быть затронуты (могут быть блокировки файловой системы на некоторых модифицированных файлах). Это особенно означает, что возможный подход ни в коем случае не может требовать наличия чистой рабочей директории.
188
задан 18 нояб. '11 в 16:04
источник поделиться
5 ответов

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

Из ссылка в командной строке:

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

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

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

256
ответ дан 02 мая '12 в 21:46
источник

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

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

  • Используя расширение MQ, которое поставляется с Mercurial

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

Вы также можете посмотреть на странице "История редактирования" в вики-версии Mercurial.

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

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

49
ответ дан 18 нояб. '11 в 16:34
источник

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

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

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

enter image description here

          ||
          ||
          \/

enter image description here

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

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

Нажатие кнопки вызовет 'commit -amend', чтобы "изменить" ревизию.

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

33
ответ дан 04 янв. '13 в 14:04
источник

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

  • Добавьте в свой .hgrc:

    [extensions]
    mq =
    
  • В вашем репозитории:

    hg qimport -r0:tip
    hg qpop -a
    

    Конечно, вам не нужно начинать с нуля или всплывать по всем патчам, поскольку для последнего достаточно одного поп файла (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.

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

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

8
ответ дан 18 нояб. '11 в 17:04
источник

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

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

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

Решение:

  • используйте hg rollback, чтобы отменить последнюю фиксацию
  • снова зафиксировать новые изменения на месте

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

6
ответ дан 18 нояб. '11 в 16:47
источник

Другие вопросы по меткам или Задайте вопрос