下一个: , 上一个: Updating a file, 上层: Multiple developers


10.3 冲突例子

假设 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);
     }

driver.c 的 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(gnu Emacs 的 cvs 前端),你可以用 Emacs 软件包的合并功能帮你解决冲突。 查看文档中的 pcl-cvs。