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