KDiff3導入の話

本題

Mercurialで手動mergeが必要な時にWinMergeを使用していたのをKDiff3に切り替えた。
Kdiff3

Mercurial.iniの設定

[merge-tools]
;[merge-tools]の一番上に↓を書いておけばOK
kdiff3.args=--auto --L1 base --L2 local --L3 other $base $local $other -o $output
kdiff3.regkey=Software\KDiff3
kdiff3.regappend=\kdiff3.exe
kdiff3.fixeol=True
kdiff3.gui=True

WinMergeで死んだ件

Win用のインストーラMercurialインスコした時に最初から入ってたMercurial.ini*1は↓で、

winmerge.args=/e /u /dl local /dr other /wr $local $other $output
winmerge.regkey=Software\Thingamahoochie\WinMerge
winmerge.regname=Executable
winmerge.checkchanged=True
winmerge.gui=True

これだと3ペイン表示されるけどなぜか3way mergeができなかった。
というか、merge済み扱いされるoutput側が弄れないのでまったくmergeを行うことができなかった。
イアンにアドバイスをもらってコマンドラインオプションを↓のようにした所3way mergeはできるようになった。

winmerge.args=/e /ub /dl other /dr local $other $output $local

が、全変更箇所について手動mergeしないといけなかったので頭がおかしくなって死んだ。
importしかconflictしてないJavaのソースのmergeだったのに。

やりたかったこと

非対話での手動mergeの時に自動merge可能な行についてはmergeを済ませて、
conflictが生じた行についてのみ↓みたいのが出てきて、チョコチョコ書き換えてやるわけなんだけど、

<<<<<<<
=======
>>>>>>>

その箇所だけ対話的にmergeできれば良かったというか、
それ以外のところは弄りたくなかった。


というのもbranch1のみに存在する行が、
branch1で追加されたものなのかbranch2で削除されたものなのか、
今までの作業内容を全部思い出しながら見ないと区別がつかないという状況だった。
自動mergeに任せきりの危険性も分かるが、
元々ある情報が欠落した状態で手動mergeするのはそれ以上にリスキーだと実感した。

KDiff3を使ってみた感じ

こんな複数headがあるとする。

@  changeset:   2:a10a3eec7f83
|  tag:         tip
|  parent:      0:d94c1c51f348
|  user:        monjudoh
|  date:        Fri May 01 22:09:17 2009 +0900
|  summary:     conflict2
|
| o  changeset:   1:80da309118c7
|/   user:        monjudoh
|    date:        Fri May 01 22:07:44 2009 +0900
|    summary:     conflict1
|
o  changeset:   0:d94c1c51f348
   user:        monjudoh
   date:        Fri May 01 22:07:15 2009 +0900
   summary:     fisrt commit

changeset 0,1,2の内容はそれぞれ以下のようになっていて、
自動mergeできる箇所があり、なおかつ手動mergeが必要な衝突をしている。

AAAAAAA
BBBBBBB
CCCCCCC
DDDDDDD
EEEEEEE
AAAAAAA
conflict1
BBBBBBB
CCCCCCC
DDDDDDD
add
EEEEEEE
AAAAAAA
conflict2
BBBBBBB
DDDDDDD
EEEEEEE

KDiff3が使える状態でこのリポジトリで、
hg mergeすると↓のようなWindowが表示される。

merge状況は下ペインで確認できる。
changeset1で追加された行、changeset2で削除された行のように自動merge可能な行については、
自動mergeした上でどちら由来かが明示されている。
マージ衝突が発生している行についてはどうかというと、
右クリックすると、以下のようにどちらのchangesetから持ってくるか選択することになる(衝突行以外も選択可能)。

KDiff3を使えば手作業によるミスの誘発を回避しつつ、
暗黙的な自動mergeによる意図しない問題の発生も防ぎやすいと思う。

*1:[merge-tools]に主要merge toolの設定が一通り書かれている