作業ノート

様々なまとめ、雑感など

svnでコンフリクトしたときに、vimdiffを使って解消する

マージでコンフリクトしたときの対応としての備忘録。

前提

例えば、svnでマージしたときにfooというファイルがコンフリクトしたとする。 コンフリクトすると、管理しているファイル以外に3つのファイルができる。

$ ls
...
foo.working
foo.merge-left.r1
foo.merge-right.r5
...
  • foo.working: ワーキングディレクトリにある元のファイル
  • foo.merge-left.r1: マージ元の変更前のファイル
  • foo.merge-right.r5: マージ元の変更後のファイル

これらを使って、コンフリクトを手動で解消する。

方法

1. vimdiffを使って差分をマージする

vimdiffを使ってファイルを開く。

$ vimdiff foo.working foo.merge-left.r1 foo.merge-right.r5

こうすると左から、

  • 左側: foo.working
  • 中央: foo.merge-left.r1
  • 右側: foo.merge-right.r5

が、vim上に表示される。

目的は変更内容をマージすること。 つまり、foo.workingに、foo.merge-left.r1とfoo.merge-right.r5の差分を適用すること。

そこで、以下の条件に従って、foo.workingを編集する。

  • merge-leftとmerge-rightに差分があるところは、workingにマージする
  • merge-leftとmerge-rightには差分がなく、workingとmerge-rightに差分があるところは、そのまま残す。

最後に編集したfoo.workingを、fooとして上書き保存する。

2. svn diffで編集したファイルの差分を確認する

そして、

$ svn diff foo

としてfooの差分を確認。このとき、マージしたいソースコードのみが差分として出ていれば、正しくマージできたことになる。

最後に、

$ svn resolved foo

とすると、コンフリクトは解消され、working, merge-left, merge-rightは削除される。