It's raining cats and dogs.

無駄なことなんてないはず

subversionをコマンドで使う練習その4

今回は二人のユーザが同一のファイルの、同一の場所を更新したことを想定する。
まずは「hoge」ユーザと、「foo」ユーザが「names.txt」を以下のように修正したものとする。

hoge$ cat names.txt
taro sato
jiro
saburo
siro
goro
rokuro
shichiro

foo$ cat names.txt
taro yamamoto
jiro
saburo
siro
goro
rokuro
shichiro

二人とも1行目に修正を加えた。
まずは、「hoge」ユーザがコミットする。

hoge$ svn commit -m "last name is sato"
送信しています              names.txt
ファイルのデータを送信中です.
リビジョン 6 をコミットしました。

続いて、「foo」ユーザがコミット

foo$ svn commit -m "last name is yamamoto"
送信しています              names.txt
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: Out of date: '/hoge_prj/trunk/names.txt' in transaction '8'

案の定失敗。
まずはリポジトリに登録してある最新の変更点をローカルに反映させる。

foo$ svn update
C  names.txt
リビジョン 6 に更新しました。

「C」が表示され、最新の状態が反映された。この「C」は、リポジトリの変更点と
ローカルの変更点をマージしようとしたときに、競合が発生したことを示す。

最新の状態になったので、前回のノリで、ローカルのファイルを再度コミットしてみる。

foo$ svn commit -m "last name is yamamoto"
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: コミットを中止しています: '/home/foo/work/hoge_prj/names.txt' がまだ衝突しています

てな感じで、また失敗した。ファイルの中身を確認してみる。

foo$ cat names.txt
<<<<<<< .mine
taro yamamoto
=======
taro sato
>>>>>>> .r6
jiro
saburo
siro
goro
rokuro
shichiro

のようになっている。自分が変更した内容と、リポジトリ内の変更点が記述されている。
競合ってのは、発生したら機械的に解決できないもので、結局のところ、どの変更が正しいのかを
人が判断することでしか、解決できない。
なので、今回の場合は「foo」と「r6(リビジョン6)の変更者」が話し合って、どちらが正しいのかを
話し合って決めてもらうしかない。
じゃあ、リビジョン6には誰が変更したのかをログをみて調べてみる。

foo$ svn log -r6 names.txt
------------------------------------------------------------------------
r6 | hoge | 2006-11-26 22:17:46 +0900 (日, 26 11月 2006) | 1 line

last name is sato
------------------------------------------------------------------------

「log」コマンドで「-r6」をつけることで、リビジョン6のコミット情報を調べることができる。
ここで、「hoge」が変更したことがわかるので、後は「foo」「hoge」でどのように変更するのか
話し合ってもらう。
話し合った結果、「foo」の内容が正しい内容で、あることがわかったので「foo」が「names.txt」を
修正する。

foo$ cat names.txt
<<<<<<< .mine
taro yamamoto
=======
taro sato
>>>>>>> .r6
jiro
saburo
siro
goro
rokuro
shichiro

↓マーカーとかを削除

foo$ cat names.txt
taro yamamoto
jiro
saburo
siro
goro
rokuro
shichiro

修正が完了したら、リポジトリに競合が解決したことを通知する必要がある。

foo$ svn resolved names.txt
'names.txt' の衝突状態を解消しました

と表示されたので、心置きなく、「foo」の内容をコミットする。

foo$ svn commit -m "last name is yamamoto"
送信しています              names.txt
ファイルのデータを送信中です.
リビジョン 7 をコミットしました。

無事コミット完了。

今回はここまで。