tl; dr: Мое оригинальное объяснение выглядит сложным, но я надеюсь, что оно полностью объясняет, как использовать очередь патчей. Вот короткая версия:
$ hg qnew -m "migration notes" -f migration my_migration.sql
$ hg qnew -f working-code
# make some changes to your code
$ hg qrefresh # update the patch with the changes you just made
$ hg qfinish -a # turn all the applied patches into normal hg commits
Mercurial Queues делает подобные вещи легкими и делает возможными более сложные манипуляции с наборами изменений. Это стоит учиться.
В этой ситуации сначала вы, возможно, захотите сохранить то, что находится в вашем текущем каталоге, прежде чем вносить изменения:
# create a patch called migration containing your migration
$ hg qnew -m "migration notes" -f migration.patch my_migration.sql
$ hg qseries -v # the current state of the patch queue, A means applied
0 A migration.patch
$ hg qnew -f working-code.patch # put the rest of the code in a patch
$ hg qseries -v
0 A migration.patch
1 A working-code.patch
Теперь давайте поработаем над рабочим кодом. Я собираюсь продолжать делать qseries
, просто чтобы быть в явном виде, но как только вы создадите мысленную модель очередей патчей, вам не придется продолжать просматривать список.
$ hg qtop # show the patch we're currently editing
working-code.patch
$ ...hack, hack, hack...
$ hg diff # show the changes that have not been incorporated into the patch
blah, blah
$ hg qrefresh # update the patch with the changes you just made
$ hg qdiff # show the top patch's diff
Поскольку вся ваша работа теперь сохраняется в очереди исправлений, вы можете отменить эти изменения и восстановить их после того, как вы извлекли удаленные изменения. Обычно, чтобы отменить все исправления, просто сделайте hg qpop -a
. Просто чтобы показать эффект на очередь патчей, я выкину их по одному за раз.
$ hg qpop # unapply the top patch, U means unapplied
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qtop
migration.patch
$ hg qpop
$ hg qseries -v
0 U migration.patch
1 U working-code.patch
На данный момент в вашем каталоге нет изменений. Сделайте hg fetch
. Теперь вы можете включить изменения очереди исправлений и объединить их, если возникнут конфликты. Концептуально это немного похоже на ребаз git.
$ hg qpush # put the first patch back on
$ hg qseries -v
0 A migration.patch
1 U working-code.patch
$ hg qfinish -a # turn all the applied patches into normal hg commits
$ hg qseries -v
0 U working-code.patch
$ hg out
migration.patch commit info... blah, blah
$ hg push # push out your changes
На данный момент вы вытеснили миграцию, сохранив другие локальные изменения. Ваши другие изменения находятся в патче в очереди. Я делаю большую часть своей личной разработки, используя очередь патчей, чтобы помочь мне лучше структурировать свои изменения. Если вы хотите избавиться от очереди исправлений и вернуться к обычному стилю, вам придется экспортировать свои изменения и повторно импортировать их в «обычный» Mercurial.
$ hg qpush
$ hg qseries -v
0 A working-code.patch
$ hg export qtip > temp.diff
$ rm -r .hg/patches # get rid of mq from the repository entirely
$ hg import --no-commit temp.diff # apply the changes to the working directory
$ rm temp.diff
Я очень зависим от очередей исправлений для разработки, и mq
- одна из самых хороших реализаций. Возможность создания нескольких изменений одновременно действительно улучшает сфокусированность и чистоту ваших коммитов. Требуется некоторое время, чтобы привыкнуть, но он невероятно хорошо сочетается с рабочим процессом DVCS.