hg transplantの基本的な使い方を覚えた。

~/.hgrcか.hg/hgrcにこれ↓をいれると使えるようになる。

[extensions]
transplant=

transplantした結果は.hg/transplant/transplantsに記録されるようだ。ただhg cloneしたときに引き継がれないので注意が必要か。このへんが基本機能のmergeと扱いが違うところ。CVSではcherry pickが基本だったのでユーザがどこをマージしたのかを覚えておかなければならなかったが、hgではグラフ構造でマージ関係を覚えるのでマージがとてもわかりやすくなった一方で、特定の変更だけをとりこむことができなくなり、拡張機能として hg transplat が用意されている、とおもう。

以下ためしてみたときのログ。画像は https://bitbucket.org/koie/hg-dot/ で作成した。

% hg init repo
% cd repo
% echo "11111" >file
% hg commit -A -m initial file
% echo "22222" >>file
% hg commit -m second file
% echo "33333" >>file
% hg commit -m third file
% hg glog --style compact
@  2[tip]   4c711a087ccd   2010-12-28 13:39 +0900   koie
|    third
|
o  1   2a9a9bbae480   2010-12-28 13:39 +0900   koie
|    second
|
o  0   7c68bdadd780   2010-12-28 13:38 +0900   koie
     initial

% hg up 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% echo "XXXXX" >>file
% hg commit -m hack file
created new head
% hg glog --style compact
@  3[tip]:1   f983fc95151f   2010-12-28 13:41 +0900   koie
|    hack
|
| o  2   4c711a087ccd   2010-12-28 13:39 +0900   koie
|/     third
|
o  1   2a9a9bbae480   2010-12-28 13:39 +0900   koie
|    second
|
o  0   7c68bdadd780   2010-12-28 13:38 +0900   koie
     initial

3

% echo "YYYYY" >>file
% hg commit -m hack2 file
% hg glog --style compact
@  4[tip]   c80cf7c8095d   2010-12-28 13:43 +0900   koie
|    hack2
|
o  3:1   f983fc95151f   2010-12-28 13:41 +0900   koie
|    hack
|
| o  2   4c711a087ccd   2010-12-28 13:39 +0900   koie
|/     third
|
o  1   2a9a9bbae480   2010-12-28 13:39 +0900   koie
|    second
|
o  0   7c68bdadd780   2010-12-28 13:38 +0900   koie
     initial

4

% cat -n file
     1  11111
     2  22222
     3  XXXXX
     4  YYYYY
% hg up 2
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% cat -n file
     1  11111
     2  22222
     3  33333
% hg transplant 4
applying c80cf7c8095d
patching file file
Hunk #1 FAILED at 0
1 out of 1 hunks FAILED -- saving rejects to file file.rej
patch failed to apply
abort: fix up the merge and run hg transplant --continue
% cat file.rej
--- file
+++ file
@@ -1,3 +1,4 @@
 11111
 22222
 XXXXX
+YYYYY
% cat -n file.rej
     1  --- file
     2  +++ file
     3  @@ -1,3 +1,4 @@
     4   11111
     5   22222
     6   XXXXX
     7  +YYYYY
% cat -n file
     1  11111
     2  22222
     3  33333
% (EDIT)
% cat -n file
     1  11111
     2  22222
     3  33333
     4  YYYYY
% hg transplant --continue
c80cf7c8095d transplanted as 22e2895df1d2
% hg glog --style compact
@  5[tip]:2   22e2895df1d2   2010-12-28 13:43 +0900   koie
|    hack2
|
| o  4   c80cf7c8095d   2010-12-28 13:43 +0900   koie
| |    hack2
| |
| o  3:1   f983fc95151f   2010-12-28 13:41 +0900   koie
| |    hack
| |
o |  2   4c711a087ccd   2010-12-28 13:39 +0900   koie
|/     third
|
o  1   2a9a9bbae480   2010-12-28 13:39 +0900   koie
|    second
|
o  0   7c68bdadd780   2010-12-28 13:38 +0900   koie
     initial

%

5