ノード: Merging Changes From Branch To Trunk, 次: , 前: Branching Basics, 上: Branches



Merging Changes From Branch To Trunk

さて、ブランチ上にバグフィクスがコミットされました。ここで作業コピーをト ランクのリビジョンの一番大きいものに切り替えて、そっちでもそのバグフィク スをする必要があるかどうか見てみます。update -A を使って作業コピーをブラ ンチから脱出させます(この点、ブランチタグはほかのスティッキーと同じです)。 そのあと、いま離れてきたブランチと diff をとってみましょう:

     floss$ cvs -q update -A
     U hello.c
     U b-subdir/random.c
     floss$ cvs -q diff -c -r Release-1999_05_01-bugfixes
     Index: hello.c
     ===================================================================
     RCS file: /usr/local/cvs/myproj/hello.c,v
     retrieving revision 1.5.2.1
     retrieving revision 1.6
     diff -c -r1.5.2.1 -r1.6
     *** hello.c   1999/05/05 00:15:07     1.5.2.1
     --- hello.c   1999/05/04 20:19:16     1.6
     ***************
     *** 4,9 ****
       main ()
       {
         printf ("Hello, world!\n");
     !   printf ("between hello and good-bye\n");
         printf ("Goodbye, world!\n");
       }
     --- 4,10 --
       main ()
       {
         printf ("Hello, world!\n");
     !   printf ("between hello and goodbye\n");
         printf ("Goodbye, world!\n");
     +   /* a comment on the last line */
       }
     Index: b-subdir/random.c
     ===================================================================
     RCS file: /usr/local/cvs/myproj/b-subdir/random.c,v
     retrieving revision 1.2.2.1
     retrieving revision 1.2
     diff -c -r1.2.2.1 -r1.2
     *** b-subdir/random.c 1999/05/05 00:15:07     1.2.2.1
     --- b-subdir/random.c 1999/04/19 06:35:27     1.2
     ***************
     *** 4,8 ****
       void main ()
       {
     !   printf ("A random number.\n");
       }
     --- 4,8 --
       void main ()
       {
     !   printf ("a random number\n");
       }
     floss$
     

diff の結果では、ブランチリビジョンでは good-bye がハイフンつきになって いて、そのファイルのトランクリビジョンのほうには最後近くにブランチのほう にないコメントがついています。一方 random.c ですが、ブランチリビジョンの ほうでは A がキャピタライズされてピリオドがついていますが、トランクのほ うではそうなっていません。

ブランチを実際に現在の作業コピーにマージするには、update を -j フラグを つけて実行します(以前、古いリビジョンに戻すときに使った j と同じ、join という意味です):

     floss$ cvs -q update -j Release-1999_05_01-bugfixes
     RCS file: /usr/local/cvs/myproj/hello.c,v
     retrieving revision 1.5
     retrieving revision 1.5.2.1
     Merging differences between 1.5 and 1.5.2.1 into hello.c
     RCS file: /usr/local/cvs/myproj/b-subdir/random.c,v
     retrieving revision 1.2
     retrieving revision 1.2.2.1
     Merging differences between 1.2 and 1.2.2.1 into random.c
     floss$ cvs -q update
     M hello.c
     M b-subdir/random.c
     floss$ cvs -q ci -m "merged from branch Release-1999_05_01-bugfixes"
     Checking in hello.c;
     /usr/local/cvs/myproj/hello.c,v  <-  hello.c
     new revision: 1.7; previous revision: 1.6
     done
     Checking in b-subdir/random.c;
     /usr/local/cvs/myproj/b-subdir/random.c,v  <-  random.c
     new revision: 1.3; previous revision: 1.2
     done
     floss$
     

こうすると、ブランチの根から先端までの変更を計算し、それを現在の作業コピー にマージします(その後に、まるでそのファイルを手で編集してその状態にした かのように、変更を表示しています)。そして、作業コピーにマージしただけで はリポジトリには変更は反映されないので、この変更をトランクにコミットしま す。

この例ではコンフリクトは起きませんでしたが、通常のマージでは起こりがちな (たぶん起こる)ことです。そうなったら、ほかのコンフリクトを解消するのと同 じように解消作業をして、それからコミットしてください。