Subversion(SVN)で共同開発をしていると、避けて通れないのがファイルの競合(conflict)。
複数人が同じファイルを編集している場合、更新時に「conflicted」状態となることがあります。
初めて見ると戸惑うかもしれませんが、慌てる必要はありません。
このポストでは、SVNで競合が起きた際の原因と、手動・自動の解決手順を丁寧に解説します。
初心者でも分かりやすいよう、具体的なコマンドや操作画面の説明を交えながら、ミスなく対処できる流れを紹介。
競合エラーに悩む前に、この記事でしっかり備えておきましょう!
はじめに:SVN競合とは?
Subversion(SVN)では、複数人が同じファイルを編集した場合に**競合(conflict)**が発生することがあります。
これは、あなたのローカル変更と、他のユーザーがすでにリポジトリにコミットした内容がぶつかっている状態です。
1. SVN競合のよくある原因
-
同じ行を複数人が同時に編集し、先に誰かがコミット
-
更新せずに編集 → その後に
svn update
-
コミット直前に他人の変更が入る
このような状況で svn update を実行すると競合が発生します。
2. 競合が発生したときの表示例
コマンドラインで以下のような出力が表示されます:
1 2 3 |
$ svn update Conflict discovered in 'index.html'. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: |
また、ファイル名の末尾に以下のような3つの一時ファイルが作られます:
-
index.html.mine
(自分の変更) -
index.html.rX
(ベースリビジョン) -
index.html.rY
(相手の変更)
3. 解決手順:自動/手動
方法1:自分の変更を優先(mine)
1 |
svn resolve --accept mine-full index.html |
この操作で、ローカルで編集した内容のみを残し、競合を解消します。
方法2:相手の変更を優先(theirs)
方法3:手動でマージ
ファイルを開くと、以下のような競合マーカーが表示されます:
1 2 3 4 5 |
<<<<<<< .mine 自分の変更内容 ======= 相手の変更内容 >>>>>>> .r1234 |
この部分を自分で修正・統合し、保存します。その後、以下のコマンドで解決済みにします:
1 |
svn resolved index.html |
4. 使用する主なコマンド一覧
コマンド | 説明 |
---|---|
svn update |
最新の変更を取得。競合が発生する可能性あり |
svn resolve --accept mine-full |
自分の変更をそのまま使う |
svn resolve --accept theirs-full |
相手の変更をそのまま使う |
svn resolved ファイル名 |
手動解決後に状態を「解決済み」にする |
svn status |
競合状態の確認(C が付く) |
5. 競合解消後の注意点
-
必ず
svn resolved
を実行してからsvn commit
すること -
.mine
や.r*
の一時ファイルは手動で削除されます(resolved
実行時) -
自動で済ませず、内容を確認するのが安全
6. まとめ
SVNの競合は、正しい手順で対処すれば決して難しいものではありません。
慣れるまでは怖く感じるかもしれませんが、「どういう状態で起きて」「どのように解決するか」がわかれば、すぐに対応できるようになります。
この記事をブックマークしておけば、いざというときにも安心です!
おまけ
tortoiseSVNの公式サイトに詳細が載っているので、確認するのも大事です。
簡単な流れ
- 【TortoiseSVN】 → 【競合の編集】で、TortoiseMergeを起動し、必要な編集を行う。
- 編集後に【TortoiseSVN】 → 【競合の解決】コマンドを実行し、リポジトリに変更をコミットする。
なお、競合の解決コマンドは実際に競合を解決する訳ではなく、変更をコミットできるようfilename.ext.mine や filename.ext.r* ファイルを削除するだけ。