TortoiseHG+hgsubversionでmerge trackingを使ってsvnのbranchをmergeする

前説

前回エントリは単純なmergeの例だったので、
svnリポジトリのbranchのmergeをMercurial上でやるメリットがそれほど大きくない。


Mercurialを使ってバージョン管理をする場合以下のようなやり方をすることが多い。
3のmergeでconflictがあまり発生しないのは、2.3でどのようにmergeしたか、
conflictをどのように解消したかをリポジトリが覚えていてくれるからで、
これをmerge trackingという。

  1. branch作成
  2. 繰り返し
    1. branchで作業
    2. defaultに変更発生(他branchからのmerge等)
    3. default→branchに逆方向merge
  3. branch→defaultにmerge


今回の話は、merge tracking機能がない1.4以前のsvnでもmerge tracking機能を活用して、
mergeを行う方法についての話。

やり方

以前default→branchの逆方向mergeを以前行なったリポジトリについて、
merge tracking機能を生かしてmergeする。
前回エントリを見ながら見ると分かりやすいと思うが、
rev213がmerge revisionで、rev214がrevertして作りsvn側にpushされたmerge revisionの双子の兄弟。

黄いのbranchから黒いdefaultにmergeするとして、

branch分岐直後のrev206〜branch先端のrev253の1本の線の中には、default→branchの逆方向mergeのmerge情報はない。
そこで、rev213のmerge情報を持たせてやるため、rev213とrev253をmergeしてしまう。
内容としてはrev253から変えてはいけないので、rev253がlocalになるようにした上で、
「Discard all changes from merge target (other) revision」にチェックを入れてmergeする。

すると、default→branchの逆方向mergeのmerge情報を持ち、svnリポジトリ上のbranchと同内容の先端が出来上がる。

これをdefaultにmergeしてやればよい。
ここから先にやることは前回エントリと一緒。


最終的にこのようなツリーが出来上がる。
256がsvn側に反映されたmerge結果。