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は削除される。