Subversion(TortoiseSVN)でツリーコンフリクト(ツリーの競合)を解決する方法
Subversion バージョン1.6では、ツリーコンフリクト(ツリーの競合)を
検出できるようになりました。
どういった機能なのか、具体的に操作しながら発生・解消してみましょう。
ツリーコンフリクト(ツリーの競合)検出の機能は、
Subversionのサーバ・クライアントがバージョン1.6以上になっていることが必要です。
(ご注意)
このページをご利用になった結果の影響については、
一切責任を負いませんので、あらかじめご了承願います。
- まず「sample10.txt」というものがあったとして、
これを例にAさんとBさんと2人で作業しようとしています。
- Aさんが、sample10.txtの名前を変更(リネーム)しようとしています。
- Aさんは、sample10.txtをsample11.txtへ名前を変更しました。
- Aさんは、名前を変更した結果をコミットしました。
- 一方のBさんは、Aさんがファイル名を変更したことを知らずに
sample10.txtを編集しました。
(本当はあってはいけないのですが‥‥。
きちんとコミュニケーションは取りましょうね。)
- Bさんは編集しようとした結果をコミットしようとします。
- しかし、Aさんが先にコミットしているので、Bさんはコミットできません。
- ここでBさんがしないといけないことは、「更新」することです。
- Bさんは更新しました。
sample10.txtは、Aさんが名前を変更されてしまっているのでもう存在しません。
一方、Bさんはこのファイルを編集してしまったので、競合が発生してしまいました。
このことを、ツリーの競合(ツリーコンフリクト)が発生したといいます。
- Bさんは、競合を編集して解消しなければなりません。
コンテキストメニューより、[TortoiseSVN] → [競合の編集]を選択してください。
競合の解消ではありません!。
- BさんはAさんと相談して、sample10.txtをsample11.txtへ
名前を変更することを納得しました。
このファイルはもう必要ないので削除します。
「ファイルを削除」を選択して[OK]を押します。
- 一方で、Bさんが編集したはずの結果はどうなっているでしょう?
名前を変更した後のsample11.txtへ反映されているはずです。
通常の方法でファイルを開いて内容を確認してください。
- Bさんは、結果に問題がないことを確認します。
- これで、競合は解消できたことがわかりました。
競合が発生したファイルは既に削除してしまっていますので、
今回は競合を解消するものは特にありません。
このまま、Bさんはコミットしてください。
(おまけ)
ここまでの作業をまとめると、
今回は「Aさんはファイル名を変更しただけ」で
「ファイルの内容を編集したのはBさんだけ」だった
ことになりますので、ツリーの競合は発生したものの、
ファイルの内容に競合は発生しませんでした。
さて、それでは今回の話をいちばん最初まで戻って、
「Aさんがsample10.txtをsample11.txtへ名前を変更して、かつ、その内容を編集していた」
としたら、どうなるでしょう?
- AさんとBさんが違う行を編集していたとすれば、
自動的にマージされます。
しかし、同時に近くの行を編集したとすれば、
ファイルの中味にも競合が発生します。
- この場合は、通常のファイルの競合ですので、
Bさんはファイルを編集して競合を解消してください。
- 編集が終われば、Bさんはこのファイル(sample11.txt)を右ボタンで選択して、
コンテキストメニューより、[TortoiseSVN] → [競合を解消]を選択してください。
全ての作業が終わったら、忘れずにコミットしてください。
(おまけ2)
ベンダブランチを利用しているときの注意点
- バージョン1.6.2で確認する限りでは、
マージの機能(リビジョンの範囲をマージ、異なる2つのツリーをマージなど)を
利用する時に、
今回のツリーコンフリクト(ツリーの競合)を検出していないようです。
通常のマージであれば、branches側を必要なリビジョンをtrunkから
マージするだけで、直接branches側を編集することはないと思いますので影響はないでしょう。
しかしながら、ベンダブランチを作成していて、
ベンダが何かしらのファイルの移動や削除などをした場合には、
マージすることによりこちら側での編集結果を失ってしまうことがありますので
注意が必要と思います。
shacho@critical.ne.jp
Last modified: Thu May 21 18:00:00 JST 2009