冲突示例

假设driver.c文件的1.4包含:

#include <stdio.h>

void main()
{
    parse();
    if (nerr == 0)
        gencode();
    else
        fprintf(stderr, "No code generated.\n");
    exit(nerr == 0 ? 0 : 1);
}

而1.6中包含:

#include <stdio.h>

int main(int argc,
         char **argv)
{
    parse();
    if (argc != 1)
    {
        fprintf(stderr, "tc: No args expected.\n");
        exit(1);
    }
    if (nerr == 0)
        gencode();
    else
        fprintf(stderr, "No code generated.\n");
    exit(!!nerr);
}

工作目录中driver.c,它是基于版本1.4。执行cvs update命令前包含:

#include <stdlib.h>
#include <stdio.h>

void main()
{
    init_scanner();
    parse();
    if (nerr == 0)
        gencode();
    else
        fprintf(stderr, "No code generated.\n");
    exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
}

运行cvs update命令:

$ cvs update driver.c
RCS file: /usr/local/cvsroot/yoyodyne/tc/driver.c,v
retrieving revision 1.4
retrieving revision 1.6
Merging differences between 1.4 and 1.6 into driver.c
rcsmerge warning: overlaps during merge
cvs update: conflicts found in driver.c
C driver.c

cvs显示其中有冲突存在。先前的文件被保留一份存为.#driver.c.1.4,合并后的driver.c文件内容为:

#include <stdlib.h>
#include <stdio.h>

int main(int argc,
         char **argv)
{
    init_scanner();
    parse();
    if (argc != 1)
    {
        fprintf(stderr, "tc: No args expected.\n");
        exit(1);
    }
    if (nerr == 0)
        gencode();
    else
        fprintf(stderr, "No code generated.\n");
<<<<<<< driver.c
    exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
=======
    exit(!!nerr);
>>>>>>> 1.6
}

上面显示了没有重复的地方合并的情况和重复的地方用<<<<<<<=======>>>>>>>做了清晰的标记。

编辑文件,去掉标记和错误的行。然后文件内容为:
#include <stdlib.h>
#include <stdio.h>

int main(int argc,
         char **argv)
{
    init_scanner();
    parse();
    if (argc != 1)
    {
        fprintf(stderr, "tc: No args expected.\n");
        exit(1);
    }
    if (nerr == 0)
        gencode();
    else
        fprintf(stderr, "No code generated.\n");
    exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
}

接着提交修改,文件版本升为1.7。

$ cvs commit -m "Initialize scanner. Use symbolic exit values." driver.c
Checking in driver.c;
/usr/local/cvsroot/yoyodyne/tc/driver.c,v  <--  driver.c
new revision: 1.7; previous revision: 1.6
done

出于保护的目的,如果你没有处理冲突cvs将拒绝提交。解决冲突后你自然会改变文件的时间戳。在以前版本的cvs中,还要求文件不能包含冲突标记。但因为文件中可能会出现合理的冲突标记(比如出现>>>>>>> 字符但又不是冲突标记),现在版本的cvs只发出警告但还会将文件提交。

假如你有1.04版以后的pcl-cvs(Emacs的cvs前端),你可以用Emacs软件包的合并功能帮你解决冲突,参考pcl-cvs相关文档。