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 工作流程配合得非常好。