1つのファイルに同時に行われた修正を統合する


最新でないバージョンのファイルに対する変更を、最新のバージョンの ファイルに統合することができます。

この場合は、統合が正しく行われたかどうかを手作業で確認する 必要があります。しかし、バージョン管理ツールを使えば、 すべてを人間が見比べて編集するよりもずっと楽に作業が行えます。


nishi さんによる修正が新バージョンとして登録された後に、 nishitmp さんが新バージョンに update しないまま、 古いバージョンのファイルを更新したとします。

ここでは main() 関数のほうを書き換えました。

void main()
{
    int i;

    /* by nishitmp */
    for ( i = 0; i < 100 ) {
        func();
    }
    printf( "hello, world!\n" );
}

cvs status を実行すると、このようなメッセージを出します。

Status: Needs Merge というのは、複数の変更を統合する必要がある ことを表しています。

===================================================================
File: file1.c           Status: Needs Merge

   Working revision:    1.2     Tue Dec 10 09:26:27 1996
   Repository revision: 1.3     /hp1/speech/CVS/test-cvs/file1.c,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

===================================================================

バージョンの統合も cvs update コマンドで行います。
nishitmp@langue[175]% cvs update
cvs update: Updating .
RCS file: /hp1/speech/CVS/test-cvs/file1.c,v
retrieving revision 1.2
retrieving revision 1.3
Merging differences between 1.2 and 1.3 into file1.c
rcsmerge: warning: overlaps or other problems during merge
cvs update: conflicts found in file1.c
C file1.c
先頭に C と表示されたファイルは、手作業で編集しなければ 新しいバージョンとして登録できません。
(もちろん登録する前に動作確認する必要があります)


新しい file1.c を見てみましょう。

nishitmp@langue[177]% m file1.c
/*
 * $Log: file1.c,v $
<<<<<<< file1.c
=======
 * Revision 1.3  1996/12/10 10:00:35  nishi
 * file1.c の func() 関数に "too much!!" 表示を追加した。
 *
 * Revision 1.2  1996/12/10 09:26:27  nishitmp
 * func() を作りました。
 *
>>>>>>> 1.3
 * Revision 1.1.1.1  1996/12/10 09:07:10  nishi
 * CVSで管理します。作りはじめたばかりです。
 *
 */

#include "file1.h"

void func()
{
    static int i = 0;
    printf( "i = %d\n", i );

    /* by nishi */
    if ( i > 10 ) {
        printf("too much!!\n");
    }
}

void main()
{
    int i;

    /* by nishitmp */
    for ( i = 0; i < 100 ) {
        func();
    }
    printf( "hello, world!\n" );
}

/* end of file */

2つの変更が1つのファイルに統合されていることがわかります。 これがちゃんと動くことが確認できたら、あらためて 最新バージョンとしてを登録します。

ここでは統合がうまく行われたのですが、 nishitmp さんのファイルはそのままでは commit できないことに なっているので、先頭のコメントの部分をちょっと削って commit します。

エディタが起動されて、コメントの入力待ちになるので、 次のようにコメントをつけました。

main() で func() を 100 回実行するようにした。
以下は、cvs commit コマンドの実行結果です。

nishitmp@langue[181]% cvs commit
cvs commit: Examining .
cvs commit: Committing .
Checking in file1.c;
/hp1/speech/CVS/test-cvs/file1.c,v  <--  file1.c
new revision: 1.4; previous revision: 1.3
done

登録された file1.c は次のようになります。

/*
 * $Log: file1.c,v $
 * Revision 1.4  1996/12/10 10:22:39  nishitmp
 * main() で func() を 100 回実行するようにした。
 *
 * Revision 1.3  1996/12/10 10:00:35  nishi
 * file1.c の func() 関数に "too much!!" 表示を追加した。
 *
 * Revision 1.2  1996/12/10 09:26:27  nishitmp
 * func() を作りました。
 *
 * Revision 1.1.1.1  1996/12/10 09:07:10  nishi
 * CVSで管理します。作りはじめたばかりです。
 *
 */

#include "file1.h"

void func()
{
    static int i = 0;
    printf( "i = %d\n", i );

    /* by nishi */
    if ( i > 10 ) {
        printf("too much!!\n");
    }
}

void main()
{
    int i;

    /* by nishitmp */
    for ( i = 0; i < 100 ) {
        func();
    }
    printf( "hello, world!\n" );
}

/* end of file */

Takuya NISHIMOTO
Last modified: 2009-09-05