Разрешение конфликтов (при слиянии с чужими изменениями)
Мы уже видели, как svn status -u может предупредить о конфликтах. Предположим, вы запустили svn update и увидели кое-что интересное:
$ svn updateU INSTALLG READMEC bar.cUpdated to revision 46.Коды U и G интереса не представляют; эти файлы без проблем поглотили изменения из хранилища. Файлы, отмеченные U, локальных изменений не содержат и были обновлены изменениями из хранилища. Отмеченные G были слиты, это значит, что файл имел локальные изменения, но изменения, пришедшие из хранилища, не перекрываются с локальными изменениями.
А вот файлы, отмеченные C, имеют конфликт. Это значит, что изменения с сервера пересеклись с вашими личными, и теперь вам нужно вручную сделать между ними выбор.
Всякий раз, когда возникает конфликт, в его обнаружении и разрешении вам, как правило, помогают три вещи:
·Subversion печатает C во время обновления и запоминает, что файл в состоянии конфликта.
·Если Subversion считает, что тип файла допускает слияние изменений, она включает в него маркеры конфликта- специальные текстовые строки, отделяющие «стороны» конфликта - чтобы визуально показать пересекающиеся области. (Subversion использует свойство svn:mime-type для определения возможности контекстного, построчного слияния.)
·Для каждого конфликтного файла Subversion добавляет в рабочую копию до трех не версионированных дополнительных файлов:
1. filename.mine - это ваш файл в том виде, в каком он присутствовал в рабочей копии до обновления - без маркеров конфликта. Этот файл содержит в себе только ваши изменения и ничего больше. (Если Subversion решает, что файл не пригоден для слияния изменений, то файл .mine не создается, так как он будет идентичным рабочему файлу.)
2. filename.rOLDREV - это файл правки BASE, где BASE- правка, которая была до обновления рабочей копии. Иными словами, это файл, который был у вас до внесения изменений.
3. filename.rNEWREV - это файл, который ваш Subversion-клиент получил с сервера при обновлении рабочей копии. Этот файл соответствует правке HEAD хранилища.
Здесь OLDREV — это номер правки файла в каталоге .svn, а NEWREV — номер правки HEAD хранилища.
Например, Салли внесла изменения в файл sandwich.txt из хранилища. Одновременно Гарри изменил файл в своей рабочей копии и зафиксировал его. Салли обновляет свою рабочую копию перед фиксацией и получает конфликт:
$ svn updateC sandwich.txtUpdated to revision 2.$ ls -1sandwich.txtsandwich.txt.minesandwich.txt.r1sandwich.txt.r2Теперь Subversion непозволит зафиксировать файл sandwich.txt, пока не будут удалены три временных файла.
$ svn commit --message "Add a few more things"svn: Commit failed (details follow):svn: Aborting commit: '/home/sally/svn-work/sandwich.txt' remains in conflictДля разрешения конфликта у вас есть три варианта:
·Объединить конфликтующий текст «вручную» (путем анализа и редактирования маркеров конфликта в файле).
·Скопировать один из временных файлов поверх своего рабочего файла.
·Выполнить svn revert <filename> для отказа от всех ваших локальных изменений.
После разрешения конфликта вам нужно известить об этом Subversion, выполнив svn resolved. Эта команда удалит три временных файла, и Subversion больше не будет считать, что файл находится в состоянии конфликта.
$ svn resolved sandwich.txtResolved conflicted state of 'sandwich.txt'Дата добавления: 2015-09-07; просмотров: 2570;