Предположим, что версия 1.4 файла driver.c содержит следующее:
#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);
}
В то же время вы работаете с рабочей копией, которая основывается на версии 1.4. Такая ситуация легко может возникнуть, если два человека независимо модернизируют один файл. Итак, ваша рабочая копия содержит следующее:
#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
}
Заметим, что все НЕперекрывающиеся модификации выполнены в новом варианте
рабочей копии файла driver.c. В то же время перекрыващиеся части
ясно показаны маркерами SPMquot<<<<<<<", SPMquot=======" и SPMquot>>>>>>>".
Вы можете разрешить конфликт простым редактированием, удалив ошибочные
строки и маркеры.
Предположим, вы получили следующий файл:
#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);
}
Теперь вы можете выполнить операцию commit и получите версию 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 не будет ничего менять в хранилище (не выполнит команду commit), если в файле остались неразреш©нные конфликты. Сейчас чтобы разрешить конфликт вам необходимо сменить дату модификации файла. Если в файле остались маркеры, то CVS предупредит вас об этом, но создаст новую версию в хранилище.
В компоненте pcl-cvs (GNU emacs интерфейс для CVS) имеется
специальный пакет, который может помочь разрешать конфликты. Подробности
следует смотреть в описании pcl-cvs, например, http://www.loria.fr/SPMquot "molli/cvs/pcl-cvs/.