Учебник по Mercurial Queues ужасен для этого варианта использования. Все примеры, которые я видел, предполагают, что вы еще не сделали коммит, и вы обновляете один патч. В большинстве случаев это не так, и у вас есть 2 или 3 коммита, которые вы хотите раздавить вместе или изменить каким-либо другим способом.
Допустим, у вас есть такая история:
---O---O---A---B---C
Первый пример - сжатие коммитов A, B и C. Первый init 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 из стека, либо указать патч для "pop to". В этом случае это будет примерно так:
$ 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-creation. Это оставляет историю таким, где A + B + C - это один коммит, представляющий собой комбинацию из трех интересующих нас патчей:
---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
связное исправление в списке рассылки.