この章では、ワークスペース管理ツールが衝突を検出するプロセスと、検出された衝突のユーザーによる解決作業を支援するプロセスについて説明します。
この章は、以下の節で構成されています。
ファイルの変更が親ワークスペースと子ワークスペースの両方で同時に行われると、それらのファイルには「衝突が存在する」といいます。子ワークスペース内のファイルと親ワークスペース内のファイルはどちらも、一方から他方にコピーすると相手側のファイルの内容を消してしまいます。衝突は更新ブリングオーバートランザクションで検出されます。衝突ファイルを親に戻すときには、あらかじめ子ワークスペース側で衝突を解消しておかなければなりません。ワークスペース管理ツールは、ユーザーがこの衝突解決作業を間違いなく行うための支援をします。GUI を使用している場合、次の手順にしたがって衝突を解決します。CLI を使用している場合、詳細はマニュアルページの resolve(1) を参照してください。
衝突を解決するには、ワークスペース管理ツールが衝突の存在を検出し、衝突ファイルに対応する履歴ファイルを準備しなければなりません。
通常、衝突解決は、ユーザーが親および子ワークスペースの両方で変更されているファイルをプットバックしようとしたときに発生します。プットバックトランザクションで衝突が存在すると、子のファイルによって親のファイルの内容が失われてしまうため、子のファイルを親にコピーする処理は中止されます。
プットバックトランザクションが中止された後は、ユーザー側で更新ブリングオーバートランザクションを実行して子ワークスペースの更新を行う必要があります。プットバック実行時に自動ブリングオーバーオプションが指定されていれば、ブリングオーバートランザクションは自動的に実行されます。ワークスペース管理ツールは、ブリングオーバートランザクションの実行時に、子のファイルにも変更が加えられていることを検出すると、衝突が存在するものと解釈します。更新ブリングオーバートランザクションの処理対象であるファイルに衝突が存在しなければ、それらのファイルのコピーまたは更新は通常通りに行われます。
更新ブリングオーバートランザクションの実行時に衝突を検出されると、ワークスペース管理ツールは、ユーザーがその衝突を解決できるように、特別な手順を実行してファイルの準備を行います。
ワークスペース管理ツールはまず、親で作成されたデルタを子の SCCS 履歴ファイルにマージします。親と子のデルタはそれぞれ、子の SCCS 履歴ファイルの別々のブランチに置かれます。これらのデルタのマージが完了すると、子の履歴ファイルには次の情報が含まれることになります。
親で作成されたデルタ
子で作成されたデルタ
該当ファイルの 2 つのバージョンに共通する祖先で作成されたデルタ
バージョン管理ツールでは、SCCS デルタ履歴 (ブランチを含む) をわかりやすく図表示することができます。
子ワークスペースの 3 つのデルタ (共通の祖先、親、子) にアクセスできるため、ユーザーはワークスペース管理ツールの衝突解決トランザクションとファイルマージを使用して、親のデルタと子のデルタを比較 (共通の祖先との比較、親子相互の比較) できます。
ワークスペース管理ツールは、デルタをマージするほか、衝突ファイルの名前を子の Codemgr_wsdata/conflicts ファイルに追加します。この conflicts ファイルは、該当ワークスペース内で解決されていない衝突のある全ファイルがリストされているテキストファイルです。
これで、衝突解決トランザクションによる衝突解決の準備が整いました。
衝突の解決には、次の 2 つのツールを使用します。
衝突解決のトランザクションウィンドウ
ファイルマージ
更新ブリングオーバートランザクションで検出される衝突の解決には、衝突解決のトランザクションウィンドウを使用します。衝突解決トランザクションは、ユーザーとファイルマージとの間の仲介役として働き、マージプロセスを調整します。
ワークスペース管理ツールは、更新ブリングオーバートランザクションの実行時に衝突を検出すると次のような処置をとります。
親ワークスペースの新しいデルタを子の SCCS 履歴ファイルにマージします。
子の Codemgr_wsdata/conflicts ファイルにそのファイルのパス名を記録します。
デフォルトの設定では、ワークスペース管理ツールはファイルリスト区画からファイルリストを自動的に順番に処理していきます。衝突の解決が完了すると、自動的にリスト内の次のファイルの処理に移ります。明示的に選択したファイルだけを個別に処理させたい場合には、「ツール属性」ダイアログの衝突解決カテゴリで「自動的に進む」オプションの選択を解除してください。
衝突はすぐに解決しなくてもかまいません。衝突の検出後も引き続き、子ワークスペース内で衝突ファイルの変更を行なったり、新しいデルタを作成したりすることができます。この場合、新しいデルタはブランチ上に作成されます。最終的にこの衝突を解決する際には、最新のデルタが親からコピーしてきたバージョンとマージされます。ただし、衝突は、ファイルを親にプットバックする前に必ず解決しておかなければなりません。
ワークスペース管理ツールは、子の SCCS 履歴ファイルに新しいデルタを作成する際に、次のような標準のコメントを挿入します。
ワークスペース間で変更をマージしました。
デフォルトの設定では、ワークスペース管理ツールはこのコメントにユーザー固有のコメントを追加するように要求するプロンプトを出しません。標準のコメントにユーザー自身のコメントの入力を求めるプロンプトを出すようにするには、「ツール属性」ダイアログで衝突解決カテゴリ「チェックインコメントのプロンプト」オプションを選択してください。
ワークスペースでの衝突を解決するには:
衝突が存在するファイルを含むワークスペースのアイコンをダブルクリックする。
衝突解決のトランザクションウィンドウが開き、衝突が存在するファイルの名前が衝突ファイルリスト区画に表示されます。
衝突ファイルリスト区画でファイルを選択し、「衝突をマージ」ボタンをクリックする。
ファイルマージが起動し、衝突ファイルリスト区画内のファイルの処理が開始されます。ワークスペース管理ツールは、リスト内の各ファイルについて、SCCS 履歴ファイルから親デルタ、子デルタ、および共通祖先デルタを抽出し、それぞれのパス名をファイルマージに渡します。ファイルが読み込まれ、マージの準備が完了すると、「ファイルマージ」ウィンドウが開きます。
ファイルマージを使用して、ファイルの親バージョンと子バージョンの相違を解決する。
詳細は、第 12 章「ファイルマージの起動とファイルの読み込み」を参照してください。
ファイルマージでファイルを保存する。
ファイルマージによりファイルの親バージョンと子バージョンの相違の解決が終了すると、ワークスペース管理ツールは、子の SCCS 履歴ファイルに新しいデルタを作成し、衝突が解決したファイルの名前を conflicts ファイルから削除します。新しいデルタは、ファイルマージでのマージ結果を含んでいます。
ここでは、ファイルマージをワークスペース管理で使用する場合について簡単に説明します。詳細は、第 12 章「ファイルマージの起動とファイルの読み込み」を参照してください。
ファイルマージは、それぞれ親のデルタと子のデルタを収めている 2 つのテキストファイルを、それぞれ読み取り専用の区画 (図 3-1 参照) に横に並べて表示します。さらに、これら 2 つの区画の下に、両ファイルをマージしたバージョンのファイルを表示する区画があります。マージされたバージョンには、いずれか一方または両方のデルタから選択された行が含まれ、これを編集して最終的なマージファイルを作成できます。
上部の 2 つの区画に、共通祖先のデルタとの比較により各デルタが次のように表示されます。
子のデルタは「子」というラベルの付いた左側の区画に表示されます。
親のデルタは「親」というラベルの付いた右側の区画に表示されます。
共通の祖先デルタとは、親のデルタと子のデルタの両方がその元にしているデルタのことです。このように、ユーザーは 3 つの方法での比較 (各デルタと共通祖先デルタ、および各デルタ相互) を行うことができます。
各子孫の行は、共通祖先の対応する行との関係に従って、次のようにマークされます。
ある行が 3 つのデルタすべてにおいて同じである場合、その行には何のマークも付きません。
ある行が祖先には存在せず、子孫のいずれかまたは両方に追加されたものである場合、追加されたデルタの該当行の隣に "+" 記号が付けられます。
ある行が祖先には存在するが、子孫のいずれかまたは両方から削除されている場合、その行が削除されたデルタの該当位置の隣に "-" 記号が付けられます。
ある行が祖先には存在するが、子孫のいずれかまたは両方で変更されている場合、変更されたデルタの該当行の隣に縦棒 (|) 記号が付けられます。
ファイルマージは、2 つのデルタ間、およびそのいずれかと共通祖先との間で異なる行を検出すると、その 2 つのデルタ内および自動的に作成されるマージファイルの該当行に適切なマークを付けます。これらのマークされた行のことを「相違」と言います。ファイルマージがフォーカスしている相違は強調表示されています。
ファイルマージがフォーカスしている (選択されている) 相違の (同じファイルで) 直後にある相違を次の相違、その直前の相違を前の相違とそれぞれ呼んでいます。
フォーカスされている相違に対して、ユーザーはオリジナルのデルタのいずれかから行を自分でコピーしたり、マージされたファイルを編集したりできます。「受け入れ」、「次」、「受け入れて次へ」のいずれかのボタンをクリックすると、現在の相違が解決されたことになります。相違が解決されると、ファイルマージは相違を示す記号をアウトラインフォント (白抜き) に変更してから、自動的に (ツール属性で「自動的に進む」オプションが選択されている場合)、またはユーザーの選択により次の相違に移動します。