hgのMQをつかうとパッチをあてたり外したりを機械的にできるようになるところが便利。

たとえば作業ディレクトリのリビジョン番号が1234だとしよう。

  1234        1235
__o___________o tip
  いまここ

じつは作業ディレクトリもひとつのチェンジセットだとおもうと hg parent で作業ディレクトリのリビジョンが表示されることに納得。

          work
          o
  1234   /    1235
__o_____/_____o tip
  いまここ

このときに hg qpush patch3 すると、こんなグラフになる。

              qbase           qtip,tip
          ____o_______o_______o
         /    patch1  patch2  patch3
__o_____/______o
  qparent      one of head
qparent パッチをあてた元チェンジセット
qbase いちばん先にあてたパッチ
qtip いちばん最後にあてたパッチ
tip 最後にcommitしたチェンジセット

ほんとtipって何の役にたつのかわからないが、たとえばパッチがあたった状態で hg pull してqparentの先がのびるとtipがかわる。

              qbase           qtip
          ____o_______o_______o
         /    patch1  patch2  patch3   tip
__o_____/______o_______________________o
  qparent                              one of head

diffのとりかたも、どことどこの差分を表示するのかでいろいろあってめんどくさい。

hg diff qtip(patch3)からworkへの変更(作業領域内での変更)
hg export qtip リビジョンpatch2からリビジョンpatch3への変更(patch3の内容そのもの)
hg qdiff patch3 + workの変更 (= hg export tip + hg diff)

実際にやってみるとこんなかんじ:

% cat -n foo
     1	export LANG=C
     2	export HGUSER=koie@example.jp
     3	rm -r repo
     4	hg init repo
     5	cd repo
     6	echo 111111111 >file
     7	hg add file
     8	hg commit -m xxx file
     9	hg qinit
    10	hg qnew patch
    11	echo 222222222 >>file
    12	hg qrefresh
    13	echo 333333333 >>file
    14	hg glog
    15	hg diff
    16	hg export qtip
    17	hg qdiff
% sh -x foo
+ export LANG=C
+ export HGUSER=koie@example.jp
+ rm -r repo
+ hg init repo
+ cd repo
+ echo 111111111
+ hg add file
+ hg commit -m xxx file
+ hg qinit
+ hg qnew patch
+ echo 222222222
+ hg qrefresh
+ echo 333333333
+ hg glog
@  changeset:   1:56e00314d749
|  tag:         patch
|  tag:         qbase
|  tag:         qtip
|  tag:         tip
|  user:        koie@example.jp
|  date:        Fri Nov 25 15:37:02 2011 +0900
|  summary:     [mq]: patch
|
o  changeset:   0:e0bf2be8ddd5
   tag:         qparent
   user:        koie@example.jp
   date:        Fri Nov 25 15:37:01 2011 +0900
   summary:     xxx

+ hg diff
diff --git a/file b/file
--- a/file
+++ b/file
@@ -1,2 +1,3 @@
 111111111
 222222222
+333333333
+ hg export qtip
# HG changeset patch
# User koie@example.jp
# Date 1322203022 -32400
# Node ID 56e00314d749987b2548cf4073f9202f9bb40c46
# Parent  e0bf2be8ddd5b4b2886984b82fe9faf9713a4604
[mq]: patch

diff --git a/file b/file
--- a/file
+++ b/file
@@ -1,1 +1,2 @@
 111111111
+222222222
+ hg qdiff
diff --git a/file b/file
--- a/file
+++ b/file
@@ -1,1 +1,3 @@
 111111111
+222222222
+333333333
%