Читать «Управление исходными текстами. Часть 1. Краткое руководство по CVS» онлайн - страница 14
Илья Рыженков
Внутри файла, в котором обнаружен конфликт, проблемные участки текста будут заключены в своеобразные скобки:
‹‹‹‹‹‹‹
зона конфликта
›››››››
Внутри зоны конфликта также будет находиться разделитель «========», который отделяет ваше изменение от проблемного, полученного из репозитория. Полностью маркировка конфликта выглядит так:
‹‹‹‹‹‹‹
имя-файла локальное (Ваше) изменение
=======
редакция из репозитория
››››››› номер редакции в репозитории
Теперь можно разрешить конфликт и оставить код в том состоянии, которое считаете правильным. При необходимости, можно пообщаться с автором конфликтующего изменения и разрешить этот вопрос совместно.
ПРЕДУПРЕЖДЕНИЕ 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) {
if (p) *p=0;
}
После этого можно выполнить операцию commit
Работа с редакциями
Управление редакциями может показаться довольно запутанным процессом, если не разобраться как следует в том, как CVS управляет ими в репозитории. Кратко сформулируем основные правила:
• У каждого файла своя нумерация редакций. Поэтому нет единой нумерованной редакции для всего проекта.
• Номер редакция изменяется при обновлении файла в репозитории. Поэтому чем чаще изменяется файл, чем чаще выполняется операция commit - тем больше редакций будет у файла в репозитории.
• Номера редакций могут только возрастать.