Учебник Mercurial Queues ужасен для этого случая использования. Все примеры, которые я видел, предполагают, что вы еще не совершили фиксацию и обновляете один патч. В большинстве случаев это не так, и у вас есть 2 или 3 коммита, которые вы хотите объединить или изменить каким-либо другим способом.
Допустим, у вас есть такая история:
---O---O---A---B---C
Первый пример - сквош коммитов A, B и C. Первый запуск mq:
$ hg qinit
Теперь нам нужно «импортировать» коммиты A, B и C в очередь исправлений. Предположим, это последние 3 коммита. Мы можем использовать синтаксис ревизии "-N", чтобы импортировать их следующим образом:
$ hg qimport -r -3:-1
Это означает импорт в виде исправлений от 3 исправлений до последней фиксации. Вы можете проверить статус этих исправлений с помощью hg qseries
. Должно появиться что-то вроде этого:
$ hg qseries
101.diff
102.diff
103.diff
Где номера 101, 102 и 103 соответствуют номерам локальных ревизий коммитов A, B и C. Теперь эти исправления применены, что означает, что изменения, которые они описывают, уже находятся в рабочей копии. Вы можете избавиться от изменений в рабочей копии и удалить их из истории коммитов, сохранив их только в форме патча, используя hg qpop
. Вы можете либо сказать hg qpop; hg qpop
, чтобы убрать изменения C и B из стека, либо указать патч, который нужно «вытолкнуть». В этом случае это будет примерно так:
$ hg qpop 101.diff
now at: 101.diff
Теперь у вас есть исправления для коммитов B и C в очереди исправлений, но они не применяются (их изменения были «потеряны» - они существуют только в области очереди исправлений). Теперь вы можете складывать эти патчи в последний, т.е. мы создаем новый коммит, который является эквивалентом суммы изменений A + B + C.
$ hg qfold -e 102.diff 103.diff
Это покажет ваш редактор, чтобы вы могли изменить сообщение фиксации. По умолчанию сообщение представляет собой объединение сообщений фиксации для изменений A, B и C, разделенных звездочками. Приятно то, что hg qfold
будет завершать исправления табуляцией, если вы используете bash и у вас есть исходный код сценария hg-completion. Это оставляет историю так, где A + B + C - это один коммит, который представляет собой комбинацию 3 патчей, которые нас интересуют:
---O---O---A+B+C
Другой вариант использования - если у нас такая же история, как и раньше, но мы хотим удалить патч B и объединить A + C. На самом деле это очень похоже на вышеизложенное. Когда вы дойдете до шага qfold, вы просто сбросите последнюю фиксацию, а не последние 2 фиксации:
$ hg qfold -e 103.diff
Это оставляет изменение для B в очереди исправлений, но оно не применяется к рабочей копии, и его фиксация отсутствует в истории. В этом можно убедиться, запустив:
$ hg qunapplied
102.diff
История теперь выглядит так, где A + C - это один коммит, объединяющий изменения A и C:
---O---O---A+C
Последний вариант использования может заключаться в том, что вам нужно применить только фиксацию C. Вы можете сделать это, запустив qimport, как указано выше, и вы удалите все патчи, которые вам не нужны:
$ hg qpop -a
Флаг -a означает удаление всех патчей. Теперь вы можете применить только тот, который вам нужен:
$ hg qpush 103.diff
Это оставляет вам эту историю:
---O---O---C
Как только вы закончите со всем этим, вам нужно закончить возиться с очередью. Это можно сделать с помощью:
$ hg qfinish -a
Итак, вот и мы. Теперь вы можете запустить hg push
и зафиксировать только то, что вы хотите, или hg email
согласованный патч в список рассылки.
person
richq
schedule
13.05.2009