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队列使这种事情变得轻而易举,并且使变更集的更复杂的操作成为可能。值得学习。
在这种情况下,您可能需要先保存当前目录中的内容,然后再进行更改:
# 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的rebase。
$ 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
此时,您已在保留其他本地更改的同时推出了迁移。您的其他更改在队列中的补丁程序中。我的大部分个人开发工作都是使用补丁队列来帮助我更好地组织更改。如果要摆脱修补程序队列并返回到正常样式,则必须导出更改,然后以“正常”状态重新导入它们。
$ 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工作流程中进展得非常好。