次: , 前: Merging a branch, 上: Branching and merging


5.7 枝から何度もマージする

前節の例を続けると、 現在のリビジョン・ツリーは次の様になっています:

     +-----+    +-----+    +-----+    +-----+    +-----+
     ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !   <- The main trunk
     +-----+    +-----+    +-----+    +-----+    +-----+
                     !                           *
                     !                          *
                     !   +---------+    +---------+
     Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
                         +---------+    +---------+

前節で枝 `R1fix' を幹にマージした事を、ここでは星線で表します。

次に、枝 `R1fix' で開発が続けられたと仮定します:

     +-----+    +-----+    +-----+    +-----+    +-----+
     ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !   <- The main trunk
     +-----+    +-----+    +-----+    +-----+    +-----+
                     !                           *
                     !                          *
                     !   +---------+    +---------+    +---------+
     Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
                         +---------+    +---------+    +---------+

そしてこの新しい変更を幹にマージしたくなりました。 ここで再び cvs update -j R1fix m.c コマンドを用いた場合、 cvs は既にマージされた変更点を重ねてマージしようとして、 望ましくない結果をもたらします。

そこで、 未だ幹にマージされてない変更点だけマージしたい旨を、 明示する必要があります。 これには、`-j' オプションで二つのリビジョンを指定します。 cvs は、 最初のリビジョンから次のリビジョンまでの変更をマージします。 例えば、この場合、最も簡単な方法は次の様になります。

     cvs update -j 1.2.2.2 -j R1fix m.c    # 1.2.2.2 から、枝 R1fix の
                                           # 先頭までの変更をマージする

この方法の問題点は、リビジョン 1.2.2.2 を自分で指定する必要がある事です。 最後にマージが行われた日時を使用する方が、少しましでしょう:

     cvs update -j R1fix:yesterday -j R1fix m.c

さらに良いのは、 変更点を幹にマージする度に、 枝 `R1fix' にタグを振っておき、 後でマージする時にそのタグを用いる方法です:

     cvs update -j merged_from_R1fix_to_trunk -j R1fix m.c