Sunday, January 07, 2007

Subversion でのマージについてのメモ

マージには、次の3つのものが関係してくる。
  • マージの始点となるブランチのリビジョン
  • マージの終点となるブランチのリビジョン
  • マージ結果を保存する作業領域
始点となるリビジョンと終点となるリビジョンの差分を取るのは当然だが、同時に始点と作業領域との差分も取る。そして、始点と終点の差分と始点と作業領域の差分をマージしたものを始点に適用したものを作業領域に置くのだ。

マージがうまくいけば、マージ結果だけが作業領域に残る。しかし、うまく2つの差分がコンフリクトして、うまくマージできなかったときは、マージが適用されたファイル中に衝突マーカーが挿入されるとともに次の3つのファイルができる。
  • *.merge-left.r{リビジョン番号}
  • *.merge-right.r{リビジョン番号}
  • *.working
最初のファイルは、始点となったファイルであり、2番めは終点となったファイルであり、3番目はマージ前の作業領域のファイルである。コンフリクトをマニュアルで解消し、svn コマンドで衝突の解消を実行すれば、この3つのファイルは消え、Commit ができる状態になる。

通常の更新(Update)もマージの一種である。更新の場合は、始点となるのが作業領域の BASE であり、終点となるのがリポジトリの HEAD であり、現在の作業内容が冒頭の 「マージ結果を保存する作業領域」 に相当する。この場合も、コンフリクトしてうまくマージできなかったときは、次の3つのファイルができる。
  • *.r{BASE のリビジョン番号}
  • *.r{HEAD のリビジョン番号}
  • *.mine
*.mine というファイルがマージする前の作業ファイルの内容を保存したファイルだ。残り2つがそれぞれ始点、終点に相当する。結局、更新(Update)というのは、BASE を始点、HEAD を終点にしてのマージ作業に他ならないのだ。

No comments: