Данная статья является продолжением моего знакомства с TortoiseSVN и посвящена модели слияния. Посмотрим как это делать правильно так как в документации, на мой взгляд, об этом сказано недостаточно. Статья основана на личных экспериментах и статье с хабра с похожим названием.
Работа с проектом в TortoiseSVN похожа на дерево. Основная работа ведется в trunk – стволе дерева. Периодически у команды возникают идеи – версия из ствола (trunk), на момент появления идеи копируется в другую папку (branch \ idea1 или что-то подобное). Далее работа может вестись параллельно – в стволе и ветвях либо только в чем-то одном. Как только работа с ветвью закончена – происходит то самое слияние со стволом обратно. Все изменения добавляются в ствол – основную линию развития проекта.
Напомню, в прошлой статье, в теории мы выяснили следующее.
Общий принцип.
Импортируем наш проект в хранилище, в папку trunk. Trunk – это ствол дерева – основное направление развития нашего проекта.
Выделяем копию из хранилища. Работаем с ней, жмём Commit. Изменения сохраняются в центральном хранилище.
Модели слияния и блокировки
Модель слияния
При работе у нас появилась идея сделать какую-то фишку в проекте.
В хранилище создаем ветвь (branch) из папки trunk. Теперь у нас в хранилище 2 одинаковые копии проекта.
В рабочей копии переключаемся на файлы из branch. При этом над стволом команда тоже может работать в это время. Работаем с копиями – в копиях ствола и ветви появляются различия. Когда работа над ветвью закончена – проводим слияние. При необходимости разрешаем конфликты (когда разные разработчики меняли одну и ту же строку, когда менялась структура деревьев и так далее).
Продолжаем работать над стволом. Модель слияния позволяет работать нескольким разработчикам одновременно. Далее, мы посмотрим как технически работать с моделью слияния.
Модель блокировок
Блокируем файл или группу, с которым мы должны работать.
Никто не имеет доступа к нему, пока он не заблокирован.
После того как поработали с файлом – разблокируем его. Главное не забыть – в этом-то вся и проблема модели блокировок 🙂 Ну и ещё одна проблема – все ждут друг друга.
Правильный цикл слияния в TortoiseSVN (пример)
В прошлом посте мы остановились на такой структуре папок
Создание ветви из ствола
На папке MyWorkCopy жмем правой кнопкой мыши и выбираем Branch / tag
Далее у нас появится такой диалог. Нам нужно прописать директорию, в которой у нас будет размещаться ветвь. Самое главное здесь – не создавать директории в ручную. Tortoise сам всё создаст – наша задача прописать в этой строке где эту директорию создать!!!
Переключение на работу с ветвью
Возвращаемся к MyWorkCopy и жмем на Switch
Здесь нам нужно переключиться на директорию ветви, которую мы создали ранее
В результате – папка MyWorkCopy заполнится файлами из Banches/branch1 – поскольку там те же файлы, что и в стволе дерева, то структура папок и файлов у нас не изменилась.
Работаем с ветвью
Идём дальше. Изменим файл C:\SVN\MyWorkCopy\SomeFolder\SomeFile.txt следующим образом
Эти изменения мы произвели в ветви.
Делаем Commit и сохраняем изменения ветви в хранилище. Файлы в Banches/branch1 будут актуализированы
Изменения сохранены – можно переходить к слиянию со стволом. Если на папках выше остался такой значок – значит сделайте Commit и на них. Можно просто на самой верхней – MyWorkCopy.
Слияние со стволом
Переключаемся на ствол и проверяем изменения
Для начала сделаем копию ствола. Переключимся обратно на ствол.
TortoiseSVN > Switch > MyWorkCopy
Выбираем путь trunk
Убедимся, что никаких изменений здесь не произошло, зайдя в C:\SVN\MyWorkCopy\SomeFolder\SomeFile.txt
Это и логично. Ведь в стволе мы никаких изменений не вносили.
Делаем резевную копию ствола в tags
Слияние не всегда проходит гладко, иногда возникают конфликты слияний. Чтобы избежать этого – предлагаю перед слиянием ствола с ветвью – сделать копию ствола. Для этого создадим новую директорию в tags и скопировать туда резервную копию
MyWorkCopy > TotroiseSVN > Branch / tag
Если мы зайдем через Repo-Browser, то увидим следующую картинку – резервная копия создана.
Переходим непосредственно к слиянию
На всякий случай делаем switch в trunc и update
Далее MyWorkCopy>TortoiseSVN>Merge
Выбираем первый вариант, так как нам нужно “слить” разные ревизии
Далее показываем из какой ветви взять изменения
Далее
Далее
Теперь, если все правильно сделали, у нас должны отобразиться изменения в виде красного значка на папке MyWorkCopy
Теперь посмотрим что у нас с файлом
Ну и последний штрих – нам нужно закрепить наши изменения
После чего увидим, что изменения ствола сохранились в репозитории
Я здесь не упомянул как разрешать конфликты, но суть в том, что нужно в ручную выбирать те или иные варианты, предлагаемые системой.
Конфликты возникают в 2 случаях
-разные пользователи меняют одну и ту же строку
-разные пользователи меняют структуру деревьев