Разрешение конфликтов в SVN
Причина конфликта версий:
Предположим, что и пользователь A, и пользователь B обновили файл kingtuns.txt, когда его номер версии был 100. После того как пользователь A изменил файл kingtuns.txt и выполнил его коммит на сервер, коммит прошёл успешно, и номер версии kingtuns.txt стал 101. Тем временем пользователь B изменил kingtuns.txt на основе версии 100. Когда пользователь B выполнил коммит изменения на сервер, коммит не прошёл, потому что изменение не было основано на текущей последней версии 101.
Мы уже выполнили checkout репозитория example01 локально. Ниже мы реализуем способ разрешения конфликтов версий.
Мы обнаруживаем, что в файле HelloWorld.html есть ошибка, и нам нужно изменить файл и зафиксировать его в репозитории.
Мы изменяем содержимое HelloWorld.html на "HelloWorld! https://www.example.com/".
root@example:~/svn/example01/trunk# cat HelloWorld.html HelloWorld! http://www.example.com/
Используйте следующую команду для просмотра изменений:
root@example:~/svn/example01/trunk# svn diff Index: HelloWorld.html =================================================================== --- HelloWorld.html (revision 5) +++ HelloWorld.html (working copy) @@ -1,2 +1 @@ -HelloWorld! http://www.example.com/ +HelloWorld! http://www.example.com/!
Попробуйте зафиксировать его изменения с помощью следующей команды:
root@example:~/svn/example01/trunk# svn commit -m "change HelloWorld.html first" Sending HelloWorld.html Transmitting file data .svn: E160028: Commit failed (details follow): svn: E160028: File '/trunk/HelloWorld.html' is out of date
На этом этапе я обнаруживаю, что фиксация не удалась.
Потому что в это время HelloWorld.html уже был изменён пользователем user02 и зафиксирован в репозитории. Subversion не позволит user01 (учётной записи svn, используемой в этом примере) зафиксировать изменения, потому что user02 уже изменил репозиторий, поэтому наша рабочая копия устарела.
Чтобы код двух людей не перезаписывал друг друга, Subversion не позволяет нам выполнить такую операцию. Поэтому перед фиксацией изменений мы должны сначала обновить рабочую копию. Итак, используйте команду update следующим образом:
root@example:~/svn/example01/trunk# svn update
Updating '.':
C HelloWorld.html
Updated to revision 6.
Conflict discovered in file 'HelloWorld.html'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
(mc) my side of conflict, (tc) their side of conflict,
(s) show all options: mc
Resolved conflicted state of 'HelloWorld.html'
Summary of conflicts:
Text conflicts: 0 remaining (and 1 already resolved)
Здесь введите "mc", чтобы отдать приоритет локальному файлу. Вы также можете использовать другие параметры для выполнения различных операций с конфликтующими файлами.
По умолчанию выполняется обновление до последней версии. Мы также можем указать, до какой версии обновляться.
svn update -r6
На этом этапе рабочая копия синхронизирована с репозиторием, и изменения можно безопасно зафиксировать.
root@example:~/svn/example01/trunk# svn commit -m "change HelloWorld.html second" Sending HelloWorld.html Transmitting file data . Committed revision 7.Другие расширения