開発ブランチマージ問題を解くための一つの方法

delta の記法を使って、このマージ問題をはっきりさせましょう。

ひとつの可能性は、主系にたいして一番高い優先順位を 与えて、キャンディスからの変更をマージし、それから プロジェクトツリー中にのみ現れるローカルな変更をマージすることに 一番低い優先順位をつけることです。この解決策は、冗長な変更からの 不要な衝突をすることなしに、以下のように書き下すことができます:


   tmp = delta(X, Y)[Z]
     where X = lord@emf.net--2003-candice/hello-world--candice--0.1--base-0
           Y = lord@emf.net--2003-candice/hello-world--candice--0.1--patch-2
           Z = lord@emf.net--2003-example/hello-world--mainline--0.1--patch-4
   

   answer = delta(L,M)[tmp]

     where L = lord@emf.net--2003-example/hello-world--mainline--0.1--patch-4
           M = /usr/lord/examples/wd/hw-AnB

利用に関する注意: マージにおける「優先順位」の概念は、どのようにして (必要な)衝突を扱うかということを処理しなくてはなりません。 主系に対して高い優先順位を与えることで、 他のふたつのツリーが含む衝突のある変更は、.rejファイルに 現れることを保証します。それは以下のような場合には重要なことになりえます。 たとえば、衝突が解消した主系に相対的な変更を最小化したい 場合です(不完全パッチ処理 — どのようにして衝突が扱われるか項 参照)。

似たように見えるが別の解決策が必要になるのは、主系よりも キャンディスのブランチに高い優先順位を与えたい場合です。


   tmp = delta(X, Y)[Z]
     where X = lord@emf.net--2003-candice/hello-world--candice--0.1--patch-2
           Y = lord@emf.net--2003-example/hello-world--mainline--0.1--patch-6
           Z = lord@emf.net--2003-candice/hello-world--candice--0.1--patch-4
   

   answer = delta(L,M)[tmp]

     where L = lord@emf.net--2003-candice/hello-world--candice--0.1--patch-4
           M = /usr/lord/examples/wd/hw-C-4

私達は実際、「手あたり次第の」方法で解決策を実装することもできます。 二つのブランチのマージ履歴を調べ、どのように解決したかを調べ、 必要なツリーをチェックアウトし、チェンジセットを計算するのにmkpatch を使い、dopatchでそれを適用する、という方法です。 しかしこのあとすぐに見るように、archはこの手のマージのために 組み込みのサポートがあります。