ファイルとディレクトリがマージされる方法

ファイルとディレクトリをマージするには、以下のようにします。

  1. ベース コントリビュータを識別します。
  2. Rational® ClearCase® マージ アルゴリズムを使用して、各コントリビュータをベース コントリビュータと比較します。(次の図を参照してください)。
  3. ベース コントリビュータとほかのコントリビュータ間で変更されていない行を、マージ出力ファイルにコピーします。
  4. ベース コントリビュータとほかのコントリビュータ間で変更された行については、コントリビュータでの変更を受け入れます。マージ操作の開始方法によっては、変更がマージ出力ファイルにコピーされる場合があります。ただし、すべてのマージ操作に対して、自動マージ機能を無効にすることもできます。この機能を無効にした場合は、マージ出力ファイルへの変更それぞれを承認する必要があります。
  5. ベース コントリビュータとほかの複数のコントリビュータとの間で変更された行については、矛盾する相違箇所を解決するよう要求されます。

コントリビュータの比較と差分の解決には差分マージが使用されます。 差分マージでは、解決された変更内容をマージ出力ファイルに書き込みます。

3 つのバージョンが示されています。
B バージョンがベース コントリビュータです。それに続く 2 つのバージョン、ソース コントリビュータの C1 と C2 は、B バージョンから派生しています。式から、宛先バージョンが、B バージョンと、B と C1 バージョンの差分と、B と C2 バージョンの差分とを足したものに等しいことが分かります。

通常、このマージ出力ファイルがターゲット ストリームの宛先バージョンとしてチェックインされます。

ファイル マージ アルゴリズム

マージは、ファイル比較の直接的な拡張です。相違箇所を表示する代わりに、差分マージは相違を分析し (開発者の支援が必要な場合もある)、テキスト部分を出力ファイルにコピーします。

受け入れた変更内容によって生成されるマージ出力に矛盾がないことを確認してください。たとえば、ファイル util.h に関係するマージを実行した後で、util.h.contrib (古い内容を含む) と新しい util.h (マージ出力を含む)のファイルを比較できます。

ベース コントリビュータの決定

すべてのコントリビュータが同じエレメントの異なるバージョンである場合、差分マージによってベース コントリビュータが自動的に決まります。差分マージではエレメントのバージョン ツリーが調査され、それまでのマージ操作で作成されたすべてのマージ矢印がその対象となります。この調査によって、作成された順序 (どのバージョンがこのバージョンより前に作成されたか) ではなく内容 (どのバージョンのデータがこのバージョンに寄与しているか) の観点で、バージョンどうしの関係が明確にされます。差分マージがベース コントリビュータとして選択するのは、このバージョン ツリー全体の中で最も近い共通の祖先です。

次の図は、一般的なマージの例とマージ結果のベース コントリビュータがどのように決まるかを示しています。

1 つのエレメントに、test、main、windows の 3 つのブランチがあります。test ブランチは、main ブランチのバージョン 4 から枝分かれして始まります。windows ブランチは main ブランチのバージョン 5 から枝分かれして始まり、main ブランチのバージョン 6 から test ブランチのバージョン 3 までのマージでベース コントリビュータとされています。
コントリビュータ バージョンは 2 つあり、test ブランチのバージョン 4 と windows ブランチのバージョン 1 です。

エレメント内でマージが実行されていなければ、バージョン ツリー内のコントリビュータ (test/4 と windows/1) ので実際の共通の祖先 (5) がベース コントリビュータに選ばれます。

すべてのコントリビュータが同じエレメントの異なるバージョンのものではないなら、共通の祖先 (またはベース コントリビュータ) は存在しません。 このとき、自動マージはオフになるので、コントリビュータの間のすべての矛盾を自力で解決する必要があります。

マージ矢印の記録

以下の条件を満たす場合、1 つ以上のマージ矢印 (Merge タイプのハイパーリンク) が作成され、マージが記録されます。

差分マージでは、各コントリビュータ バージョン (ベース コントリビュータを除く) から出た矢印がターゲット バージョンをポイントします。このマージ矢印は、バージョン ツリー ブラウザで見ることができます。

マージ ハイパーリンクを含むバージョンの検索

findlsvtree -merge コマンドを使用して、Merge ハイパーリンクを含むバージョンを検索できます。describe コマンドを実行すると、次に示すように、1 つのバージョンの、マージ矢印を含むすべてのハイパーリンクをリストします。

cleartool describe util.h@@/main/3version "util.h@@/main/3"
.
.
.
Hyperlinks:
Merge@278@/vob_3 /vob_3/src/util.h@@/main/rel2_bugfix/1
-> /vob_3/src/util.h@@/main/3

ディレクトリ マージ アルゴリズム

Rational ClearCase ディレクトリ エレメントの各バージョンには、特定のファイル エレメント、ディレクトリ エレメント、VOB シンボリック リンクの名前が含まれます。差分マージでは、同じディレクトリ エレメントの複数のバージョンを処理して、すべてのコントリビュータの内容を反映するディレクトリ バージョンを作成することができます。そのアルゴリズムは、ファイル マージのアルゴリズムと似ています。複数のコントリビュータが競合するときにだけ、差分マージからユーザー対話のプロンプトが表示されます。

ディレクトリ バージョンの 1 つであるマージ ターゲットをチェックアウトする必要があります。(通常は、自分のビューにあるバージョンをチェックアウトします。)差分マージは、エレメントとリンクの名前を追加、削除、変更して、チェックアウトするディレクトリを更新します。

ヒント: ディレクトリ マージの実行後に、ターゲット バージョンのマージ前の内容を含む .contribファイルは生成されません。

ディレクトリのマージ

ディレクトリをマージするには、以下のようにします。

  1. ディレクトリのすべてのコントリビュータ バージョンがチェックイン済みであることを確認します。
  2. ディレクトリのターゲット バージョンをチェックアウトします。
  3. チェックアウトしたバージョンにそれ以上の変更を加えず、直ちにディレクトリ マージを実行します。

この手順で行うと、マージの結果を簡単かつ正確に判断できます。 merge で更新したばかりのチェックアウト済みバージョンに対して diff -predecessor コマンドを実行します。

差分マージでの ln と rmname の使用

ディレクトリ マージを実装するには、VOB ハード リンクを使用します。ln コマンドと rmname コマンドを使用して、手動で完全または部分マージを実行できます。『IBM Rational ClearCase コマンド リファレンス』の lnrmname のリファレンス ページを参照してください。

関連概念
ベース ClearCase でのマージについて
最新バージョンと変更のマージについて

フィードバック