SVN 競合の解決


バージョン競合の原因:

A、B の2人のユーザーがバージョン番号100のときに kingtuns.txt ファイルを更新したとします。A ユーザーは修正完了後、kingtuns.txt をサーバーにコミットしました。このときコミットは成功し、kingtuns.txt ファイルのバージョン番号は101になりました。同時に B ユーザーはバージョン番号100の kingtuns.txt ファイルに修正を加えました。修正完了後にサーバーへコミットしようとしたとき、現在の最新バージョン101に基づいた修正ではないため、コミットは失敗しました。

私たちはすでにローカルに サンプル01 リポジトリをチェックアウトしています。以下ではバージョン競合の解決方法を実践します。

HelloWorld.html ファイルにエラーがあることを発見しました。ファイルを修正してバージョンリポジトリにコミットする必要があります。

HelloWorld.html の内容を "HelloWorld! https://www.example.com/" に変更します。

root@サンプル:~/svn/サンプル01/trunk# cat HelloWorld.html 
HelloWorld! http://www.example.com/

以下のコマンドで変更を確認します:

root@サンプル:~/svn/サンプル01/trunk# svn diff 
Index: HelloWorld.html
===================================================================
--- HelloWorld.html     (revision 5)
+++ HelloWorld.html     (working copy)
@@ -1,2 +1 @@
-HelloWorld! http://www.example.com/
+HelloWorld! http://www.example.com/!

以下のコマンドで変更をコミットしてみてください。

root@サンプル:~/svn/サンプル01/trunk# svn commit -m "change HelloWorld.html first"
Sending        HelloWorld.html
Transmitting file data .svn: E160028: Commit failed (details follow):
svn: E160028: File '/trunk/HelloWorld.html' is out of date

このとき、コミットに失敗しました。

なぜなら、この時点で HelloWorld.html は user02 によって修正され、リポジトリにコミットされているからです。Subversion は user01 (この例で使用している svn アカウント) が変更をコミットすることを許可しません。user02 がすでにリポジトリを変更しているため、私たちの作業コピーは無効になっています。

二人のコードが互いに上書きされるのを防ぐため、Subversion はこのような操作を許可しません。したがって、変更をコミットする前に作業コピーを更新する必要があります。そこで、次のように update コマンドを使用します。

root@サンプル:~/svn/サンプル01/trunk# svn update
Updating '.':
C    HelloWorld.html
Updated to revision 6.
Conflict discovered in file 'HelloWorld.html'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options: mc
Resolved conflicted state of 'HelloWorld.html'
Summary of conflicts:
  Text conflicts: 0 remaining (and 1 already resolved)

ここで "mc" を入力すると、ローカルのファイルが優先されます。また、他のオプションを使用して、競合するファイルに対して異なる操作を行うこともできます。

デフォルトでは最新バージョンに更新されますが、どのバージョンに更新するかを指定することもできます。

svn update -r6

このとき、作業コピーはリポジトリと同期しているため、安全に変更をコミットできます。

root@サンプル:~/svn/サンプル01/trunk# svn commit -m "change HelloWorld.html second"
Sending        HelloWorld.html
Transmitting file data .
Committed revision 7.
その他の拡張