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

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

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

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

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

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

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

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

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

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

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

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

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

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

256
ответ дан Chris Phillips 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
ответ дан krtek 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
ответ дан Cristi Diaconescu 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
ответ дан hochl 18 нояб. '11 в 17:04
источник поделиться

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

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

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

Решение:

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

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

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

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