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の設定が一通り書かれている