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
. パッチ キューへの影響を示すために、一度に 1 つずつポップします。
$ 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
おり、最も優れた実装の 1 つです。複数の変更を同時に作成できることで、コミットの集中度とクリーン度が大幅に向上します。慣れるまで少し時間がかかりますが、DVCS ワークフローとの相性は抜群です。