TortoiseSVN. Правильный цикл слияния

Данная статья является продолжением моего знакомства с TortoiseSVN и посвящена модели слияния. Посмотрим как это делать правильно так как в документации, на мой взгляд, об этом сказано недостаточно. Статья основана на личных экспериментах и статье с хабра с похожим названием.

Работа с проектом в TortoiseSVN похожа на дерево. Основная работа ведется в trunk – стволе дерева. Периодически у команды возникают идеи – версия из ствола (trunk), на момент появления идеи копируется в другую папку (branch \ idea1 или что-то подобное). Далее работа может вестись параллельно – в стволе и ветвях либо только в чем-то одном. Как только работа с ветвью закончена – происходит то самое слияние со стволом обратно. Все изменения добавляются в ствол – основную линию развития проекта.

Сосна

Напомню, в прошлой статье, в теории мы выяснили следующее.

Общий принцип. 

Импортируем наш проект в хранилище, в папку trunk. Trunk – это ствол дерева – основное направление развития нашего проекта.

Выделяем копию из хранилища. Работаем с ней, жмём Commit. Изменения сохраняются в центральном хранилище.

Модели слияния и блокировки

Модель слияния

При работе у нас появилась идея сделать какую-то фишку в проекте.

В хранилище создаем ветвь (branch) из папки trunk. Теперь у нас в хранилище 2 одинаковые копии проекта.

В рабочей копии переключаемся на файлы из branch. При этом над стволом команда тоже может работать в это время. Работаем с копиями – в копиях ствола и ветви появляются различия. Когда работа над ветвью закончена – проводим слияние. При необходимости разрешаем конфликты (когда разные разработчики меняли одну и ту же строку, когда менялась структура деревьев и так далее).

Продолжаем работать над стволом. Модель слияния позволяет работать нескольким разработчикам одновременно. Далее, мы посмотрим как технически работать с моделью слияния.

Модель блокировок

Блокируем файл или группу, с которым мы должны работать.

Никто не имеет доступа к нему, пока он не заблокирован.

После того как поработали с файлом – разблокируем его. Главное не забыть – в этом-то вся и проблема модели блокировок 🙂 Ну и ещё одна проблема – все ждут друг друга.

Правильный цикл слияния в TortoiseSVN (пример)

В прошлом посте мы остановились на такой структуре папок

1


Создание ветви из ствола

На папке MyWorkCopy жмем правой кнопкой мыши и выбираем Branch / tag

2

Далее у нас появится такой диалог. Нам нужно прописать директорию, в которой у нас будет размещаться ветвь. Самое главное здесь – не создавать директории в ручную. Tortoise сам всё создаст – наша задача прописать в этой строке где эту директорию создать!!!

3

 

4

 


Переключение на работу с ветвью

Возвращаемся к MyWorkCopy и жмем на Switch

5

Здесь нам нужно переключиться на директорию ветви, которую мы создали ранее

6

 

В результате – папка MyWorkCopy заполнится файлами из Banches/branch1 – поскольку там те же файлы, что и в стволе дерева, то структура папок и файлов у нас не изменилась.


 

Работаем с ветвью

Идём дальше. Изменим файл C:\SVN\MyWorkCopy\SomeFolder\SomeFile.txt следующим образом

7

 

Эти изменения мы произвели в ветви.

Делаем Commit и сохраняем изменения ветви в хранилище. Файлы в Banches/branch1 будут актуализированы

8

 

Изменения сохранены – можно переходить к слиянию со стволом. Если на папках выше остался такой значок – значит сделайте Commit и на них. Можно просто на самой верхней – MyWorkCopy.


Слияние со стволом

Переключаемся на ствол и проверяем изменения

Для начала сделаем копию ствола. Переключимся обратно на ствол.

TortoiseSVN > Switch > MyWorkCopy 

Выбираем путь trunk

9

Убедимся, что никаких изменений здесь не произошло, зайдя в C:\SVN\MyWorkCopy\SomeFolder\SomeFile.txt

10

 

Это и логично. Ведь в стволе мы никаких изменений не вносили.

Делаем резевную копию ствола в tags

Слияние не всегда проходит гладко, иногда возникают конфликты слияний. Чтобы избежать этого – предлагаю перед слиянием ствола с ветвью – сделать копию ствола. Для этого создадим новую директорию  в tags и скопировать туда резервную копию

MyWorkCopy > TotroiseSVN > Branch / tag

12

 

Если мы зайдем через Repo-Browser, то увидим следующую картинку – резервная копия создана.

13

 

Переходим непосредственно к слиянию

На всякий случай делаем switch  в trunc и update

Далее MyWorkCopy>TortoiseSVN>Merge

Выбираем первый вариант, так как нам нужно “слить” разные ревизии

14

 

Далее показываем из какой ветви взять изменения

15

 

Далее

16

 

Далее

17

 

Теперь, если все правильно сделали, у нас должны отобразиться изменения в виде красного значка на папке MyWorkCopy

18

 

Теперь посмотрим что у нас с файлом

19

 

 

Ну и последний штрих – нам нужно закрепить наши изменения

20

 

После чего увидим, что изменения ствола сохранились в репозитории

21

 

Я здесь не упомянул как разрешать конфликты, но суть в том, что нужно в ручную выбирать те или иные варианты, предлагаемые системой.

Конфликты возникают в 2 случаях

-разные пользователи меняют одну и ту же строку

-разные пользователи меняют структуру деревьев

This entry was posted in SVN, Без рубрики. Bookmark the permalink.