Управление исходными текстами. Часть 1. Краткое руководство по CVS | страница 16



Внутри файла, в котором обнаружен конфликт, проблемные участки текста будут заключены в своеобразные скобки:

>‹‹‹‹‹‹‹

>зона конфликта

>›››››››

Внутри зоны конфликта также будет находиться разделитель «========», который отделяет ваше изменение от проблемного, полученного из репозитория. Полностью маркировка конфликта выглядит так:

>‹‹‹‹‹‹‹

>имя-файла локальное (Ваше) изменение

>=======

>редакция из репозитория

>››››››› номер редакции в репозитории


Теперь можно разрешить конфликт и оставить код в том состоянии, которое считаете правильным. При необходимости, можно пообщаться с автором конфликтующего изменения и разрешить этот вопрос совместно.

ПРЕДУПРЕЖДЕНИЕ CVS считает, что если время модификации файла (modification time) изменилось с момента обнаружения конфликта, то проблема решена и файл готов к отправке в репозиторий. Поэтому сначала рекомендуется просмотреть все конфликты в файле (их может быть несколько) используя, например, поиск строки “‹‹‹”, понять, как они должны быть решены, и уже потом «одним движением» внести все правки. Если же вы исправите не все конфликты и сохраните файл, а затем выполните операцию commit, в репозитории окажется файл с маркировкой конфликта внутри, и проблемы практически неизбежны. CVS сообщит о таких случаях предупреждением «warning: file `имя-файла' seems to still contain conflict indicators», но версию в репозиторий всё же отправит, поскольку не может быть уверен в своих догадках.

Пример конфликта в исходном тексте на C++

>void clear_string(char *p) {

> *p=0; // здесь обнаружена ошибка - не было проверки на NULL

>}

Ошибку обнаружили двое программистов независимо и, поскольку изменение простейшее, решили тут же её и поправить. Один сделал так:

>void clear_string(char *p) {

> if (p) *p=0;

>}

А другой так:

>void clear_string(char *p) {

> if (!p) return;

> *p=0;

>}

Первый поместил версию в репозиторий. Второй попытался тоже обновить репозиторий, на что CVS сообщил, что рабочий каталог устарел и требуется обновление:

>cvs commit: Up-to-date check failed for `test.c'

>cvs commit: file `todo.txt' had a conflict and has not been modified

Он обновляет свой рабочий каталог командой cvs update и получает сообщение о конфликте. Открыв файл, он обнаруживает следующее:

>void clear_string(char *p) {

>‹‹‹‹‹‹‹ test.c

> if (!p) return;

> *p=0;

>=======

> if (p) *p=0;

>››››››› 1.2

>}

Разрешение конфликта не займёт много времени, и файл вновь принимает рабочий вид.

>void clear_string(char *p) {