Данная статья про модель слияний и её применение в проекте Delphi. Из книги svn-book мы знаем следующее о слиянии.
В какой-то момент проект копируется и уходит в ветвь. Развитие идет параллельно в ветви и стволе. На рисунке это происходит в момент ревизии r341, далее авторы, в данном случае 2 автора продолжают работать с разными версиями, делают ревизии каждый в своей ветви, стволе. После чего происходит слияние с возможным разрешением конфликтов. Оно не указано на рисунке. Я могу, конечно, в чем-то ошибаться, поправьте меня, если это не так.
Это очень похоже на теорию множеств из математики. M0 на рисунке это тот код, над которым работают разработчики, каждый из них работает в своей ветви, кто-то в стволе. M1 и M2 соответственно это множества, которые изменяются разработчиками, они являются подмножествами M0, и при слиянии, если пересечения M1 и M2 не было, то всё сливается без проблем. А вот если пересечение есть – нужно в ручную править, выбирать тот или иной вариант из подмножеств, либо написать третий.
Попробуем такую штуку проделать в Delphi.
Создание проекта
Создадим обычный VCL проект и импортируем его на сервер VisualSVN в папку trunk, предварительно подготовив для него структуру директорий таким образом. О том как импортировать из Delphi смотрите предыдущую статью.
Итак, если мы будем смотреть из Repo-Browser Delphi, то будем видеть такую картину
Причем папка на локальном диске, из которой мы импортировали, автоматически встанет под контроль версий, о чем нам просигнализирует зеленая иконка.
Копирование проекта в другую ветвь
Я не нашел как создавать ветви из Repo-Browser Delphi – возможно плохо искал, возможно, действительно нет. Отображать – он всё прекрасно отображает, а вот создать новую ветвь на сервере – не получается.
Альтернативный путь – создание ветви из Repo-Browser TortoiseSVN или на крайний случай – через сам сервер VisualSVN. Словом, варианты есть. Воспользуемся TortoiseSVN.
Итак, на нашей папке DelphiMerge жмем правой кнопкой мыши, открываем меню TortoiseSVN и выбираем Branch / Tag…
Здесь внимание !!! Ничего не добавляем в ручную! Никаких папок ни на сервере ни на клиенте. Просто пропишем путь для ветви – где бы мы хотели её создать. TortoiseSVN сам всё сделает и расставить родственные связи между папками. Подпишем комментарий – выберем номер ревизии, в нашем случае подойдет HEAD ревизия.
Вот результат
В принципе это всё, что нам нужно было от дружелюбного TortoiseSVN. Далее возвращаемся к Delphi.
Переключение на работу с ветвью
Возвращаемся в Delphi. И жмем Switch
После чего выбираем директорию новой ветви – 2 раза жмём Ок.
В Delphi в общем случае обязательно делать Update после переключения (switch) на ветвь / ствол / tags или что угодно !!!
Заходим в LOg, чтобы убедиться, что мы в нужной ветви
Что у нас есть здесь? 9 ревизия – создание новой ветви! Значит мы там, где нужно. Можем приступать к реализации новой идеи проекта в отдельной ветви. Добавим Memo и напишем какой-нибудь текст.
Возвращаемся в ствол
А тем временем в команде тихо кипела работа над стволом и там тоже были кое какие изменения!!! Ну а если нет – мы возьмем их сами и сделаем !!!
Итак Switch на trunk и Update
Далее делаем Update
На форме изобразим какую-нибудь активность. Как будто в стволе тоже кое что происходило!!!
Слияние ствола и ветви
Выбираем Merge…
Выбираем URL и диапазон ревизий. URL это месторасположение файлов в нашей ветви. Диапазон ревизий. 9 ревизия – это когда мы создали копию. 10 ревизия, это когда мы прокомиттили изменения в ветви.
В следующем окне я ничего не менял
И вот уже Delphi рапортует об успешном слиянии.
Внимание, эта статья не окончена и врят ли будет окончена. Слияние можно производить как из Delphi так и из TortoiseSVN. Экспериментируйте.