名前

tla star-merge — 相互にマージされた開発ライン間でのマージ

用法

tla star-merge [options] [FROM]

説明

プロジェクトツリーに FROM からの変更点をマージしますが、 この際、プロジェクトツリー側の参照基準点をバージョン REFERENCE とみなした上て FROM との間の共通の祖先を考慮します。 REFERENCEを指定しなければプロジェクトツリーのデフォルトバー ジョンが利用されます。FROM が指定されなければ、プロジェクト ツリーのリビジョンが利用されます。このコマンドの目的は、双方 向にマージが起こる可能性のある二つの開発ライン間の変更をマー ジすることです。マージに関する履歴をうまく利用することによっ て'相互マージ'からおこる過剰な衝突を最小限に押えようとします。

処理の詳細を以下に述べます。まず FROM はあるリビジョン を示しています。リビジョンのかわりにバージョンが指定された場 合は、そのバージョンにある最新のリビジョンが指定されたものと 考えます。次に TREE を実際のマージがおこるプロジェクトツリー であるとします。このとき star-merge は REFERENCE と FROM リ ビジョンとの間の「直近の共通祖先」 ANCESTOR を計 算し、それから以下のチェンジセット:

delta (ANCESTOR, FROM)

を、TREE に適用します。つまり ANCESTOR と FROM の差分 を TREE に適用します。

あとは「直近の共通祖先」を定義すれば話しが 終ります。このため更に MAYBE_ANCESTOR_1, MAYBE_ANCESTOR_2, LAST_MERGE_INTO_FROM を補助的に定義します。

MAYBE_ANCESTOR_1 は、TREE と FROM の双方が持っているパッ チログでバージョン REFERENCE に属するもののうち、最も大きな パッチレベルに対応したリビジョンです。言い替えると TREE にす でにマージされた FROM が属するバージョンにあるリビジョンのう ち、REFERENCE に含まれる最後のリビジョンのことです。 MAYBE_ANCESTOR_2 は FROM と REFERENCE の両方にあるパッチログ のうち、REFERENCE 中での最も大きなパッチレベルとして定義され ます。言い替えると、すでに FROM にマージされたリビジョンのう ち、REFERENCE バージョンに属する最後のリビジョンのことです。 MAYBE_ANCESTOR が 空でない場合、これはは FROM のバージョン中 のあるリビジョンで FROM にマージされたはずです。このリビジョ ンを LAST_MERGE_INTO_FROM と言います。 MAYBE_ANCESTOR_1 も MAYBE_ANCESTOR_2 も空であれば star-merge は何もしません。どちらか一方のみが空であれば、もう一方の腔で ない方を ANCESTOR とします。両方共空でない場合は LAST_MERGE_INTO_FROM と MAYBE_ANCESTOR_1 が比較されます(両方 とも FROM のバージョン中のリビジョンであることに注意してくだ さい)。もし MAYBE_ANCESTOR_1 の方が新しければこれを ANCESTOR とします。そうでなければ MAYBE_ANCESTOR_2 を ANCESTOR としま す。

star-merge のアルゴリズムはこのように複雑ですが、利用 するのは簡単です。重要なことは 1. このコマンドはほとんどの場 合にマージ作業をうまくやってくれること、2. マージの結果はプ ロジェクトツリーに反映させるだけでアーカイブへの書き込みはお こらないこと、3. star-merge が何を実行しようとその実行結果は tla changes --diffs コマンドで確認できること、4. 実行結果が 気に入らなければいつでも tla undo で取り消せること、です。マー ジのアルゴリズムについては star-merge の他にもいくつかのアイ ディアが模索されています。

別名

なし

変更: [-W--]

スイッチ

-A, --archive            Override tree archive
-c, --changes OUTPUT     Generate but don't apply the changeset.
-r, --reference VERSION  Set reference version (default: project tree version)
-N, --forward            pass the --forward option to `patch'
-t, --three-way          Perform a 3-way (diff3-style) merge.
-d, --dir DIR            Operate on project tree in DIR (default`.')

CVS対応コマンド

なし