subclipseでupdate時に衝突した場合の解決方法
一人利用だとsubversionを利用していてもコミット時に衝突することなどなかったのですが、実際に衝突してみて分かったことをメモ
subclipseでの衝突表示
update(更新)実行時に、自分が変更を加えたリビジョン(rev9)より新しいリビジョン(rev10)がすでにコミット済みで、変更位置が重なっていた場合、衝突が発生します。つまり、編集箇所がかぶってしまった場合に発生するわけです。
衝突が発生すると、衝突が発生した箇所に
という3つの行が現れます。どうやらこれらは、<<<<<<< .mine ======= >>>>>>> .r10
という意味みたいです。つまり、自分の作業コピーの内容に戻すには、「=======」から「>>>>>>> .r10」までを削除すればいいわけです。(衝突に関係ないところ) <<<<<<< .mine (updateしようとしたときの作業コピーの内容) ======= (すでにコミットされていたレポジトリrevision10の内容) >>>>>>> .r10(衝突に関係ないところ)
修正してコミットしてみる
上記のように、衝突時、ファイルに>や<が大量に書き込まれてしまうので、手元でファイルを修正してコミットします。しかし、以下のようなエラーが発生してしまいます。
衝突を修正したはずなのにどうすればよいのか。'SVNコミット' has encountered a problem. org.tigris.subversion.javahl.ClientException: A conflict in the working copy obstructs the current operation svn: Commit failed (details follow): svn: Abortingj commit: 'D:\...\workspace\作業コピーの場所\ClassName.java' remains in conflict
どうすればいいのか
衝突していた場所を適切に修正したのにエラーが表示されたわけですが、ではいったいどうすればいいのか。
エラー本文に「remains in conflict」とありますが、これは内容的な衝突が残っているということではなく、とあるファイルが残っていることを示しています。たとえば、ClassName.javaファイルが衝突していた場合、同じファイル階層に
ClassName.java.mineの3つが作成されているはずです。「.mine」ファイルが自分の作業コピー、「.r9」が自分が変更を加えていたリビジョン、「.r10」がすでにレポジトリにコミットされていた内容を表したファイルです。これらが削除されるまで「remains in conflict」が残ってしまいます。つまり、これら3ファイルを削除すればOKです。
ClassName.java.r9
ClassName.java.r10
具体的な方法
まず、.java.mine、.java.r??ファイルなどを参考にしながら、もともとの作業コピーである.javaファイルを修正します。
続いて、「Package Explorer」上の.javaファイルを右クリックして、「Team>解決済みにマーク」をクリックし、「解決済みにマーク」ダイアログを表示させます。
What do you want to do?ここで、「Conflicts have been resolved in the file」を選択すれば完了ですcf. $svn help resolved
- Conflicts have been resolved in the file.
- Resolve the conflict by using my version of the file.
- Resolve the conflict by using the incoming version of the file.
- Resolve the conflict by using the base version of the file.
強制的に上書きしたいときは
このような衝突時に強制的に自分の作業コピーでレポジトリを上書きしたい場合は、「Resolve the conflict by using my version of the file.」を選択すればOKです。
まとめ
衝突したときは、機械的に生成される「.mine」「.r最新の番号」「.r古い番号」という3ファイルをどうにかして削除する必要があり、削除には、「解決済みにマーク」を利用するのがよい。
バージョン管理ってすごく便利だけど、機能がたくさんあって難しい。