tla star-merge — 相互にマージされた開発ライン間でのマージ
プロジェクトツリーに 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 の他にもいくつかのアイ ディアが模索されています。
-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`.')