next up previous contents
Next: 14.19 Список команд CVS Up: 14. CVS - система Previous: 14.17 Игнорирование файлов посредством

14.18 Простой пример разрешения конфликта при объединении версий

Предположим, что версия 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/.


next up previous contents
Next: 14.19 Список команд CVS Up: 14. CVS - система Previous: 14.17 Игнорирование файлов посредством
Andrei Chevel
Andrei.Chevel@pnpi.spb.ru


Banner.Novgorod.Ru