Как работать с ветками
Создать новую ветку очень просто. Делается это командой copy. Допустим, мы разрабатываем некий проект — BUMP. Тогда для создания ветки my-branch нужно выполнить такую команду:
svn copy https://svnserver/var/bump/trunk https://svnserver/var/bump/branches/my-branch -m="Creating a private branch of /bump/trunk"
Для того, чтобы переключиться в новую ветку:
svn switch svn://svnserver/var/bump/branches/my-branch
Для того, чтобы проверить в какой ветке находимся сейчас:
svn info
Переключившись в новую ветку, мы можем вносить правки, выполнять
commit
, и никто другой ничего не заметит. Но надо помнить, что команда
switch
очень похожа на команду
update
, поэтому, если вы будете переключаться из одной ветки в другую, вы можете получить конфликты, если были правки в одном и том же файле. Именно поэтому, надо почаще объединять изменения из основной ветки.
Копирование изменений между ветками
Для того, чтобы держать свою ветку в актуальном состоянии, необходимо периодически копировать изменения из основной ветки. Это необходимо для того, чтобы избежать конфликтов при слиянии веток или при переключении в основную ветку.
Команда
merge
, наверное, самая сложная из команд
SVN
. И все дело в том, что некоторые старые версии
SVN
могут не помнить о раннее выполненных объединениях. А раз не помнят, значит вы рискуете повторно скопировать в проект изменения, которые уже у вас есть после предыдущего объединения.
Этот недостаток легко обойти. После каждого копирования изменений к себе в рабочую копию вам необходимо выполнить
commit
и сохранить их в своей ветке. В комментарии укажите диапазон ревизий, включенных в ваше текущее объединение.
То есть, например так: «merged from trunk r1234:1256». Этот комментарий будет служить вам памяткой, и вы в любой момент сможете посмотреть, когда вы последний раз объединялись, и какая ревизия является последней. Такие комментарии нужно включать обязательно, иначе, могут возникнуть непонятные проблемы и нестыковки.
И еще. Для того, чтобы быть уверенным, что все объединилось удачно, можно сначала (перед реальным копированием) сделать проверочное копирование. Для этого используется параметр --dry-run, который только показывает вывод, не внося изменений в рабочую копию.
Итак, посмотреть изменения из trunk можно такой командой:
svn merge -r4106:HEAD svn://svnserver/var/bump/trunk ./ --dry-run
Получаем, например, такой вывод:
--- Merging r4107 into '.':
U db/queries.txt
U ejb/src/main/java/ru/bump/action/folder/MoveFolderActionLocal.java
U ejb/src/main/java/ru/bump/action/user/UserRegistrationAction.java
Это означает, что в ревизии r4107 изменилось 3 файла. Отлично, все правильно, копируем изменения:
svn merge -r4106:HEAD svn://svnserver/var/bump/trunk ./
И выполняем
commit
:
svn ci -m "merged from trunk r4106:4108"
Число 4108- это номер текущей ревизии. Получить его просто. Достаточно выполнить команду svn up.
Заметьте, что число 4106, в этом случае, это ревизия создания нашей ветки. Когда вы будете первый раз объединяться, вам нужно будет узнать номер этой ревизии. Это легко, достаточно выполнить команду
svn log --stop-on-copy
Далее вам это число больше не понадобится. Номер нужной ревизии вы сможете узнать из вашего же комментария. Таким образом, когда вы будете объединяться в следующий раз вам необходимо выяснить номер ревизии последнего объединения.
Например так:
svn log | grep "merged from trunk r4106:4108"
Таким образом, чтобы объединить еще раз из trunk нужно выполнить команду:
svn merge -r4109:HEAD svn://svnserver/var/bump/trunk ./