Предыдущий ролик Следующий ролик  

Видео урок: Ветвление и слияние

Принципы контроля версий

Последние важные функции, которые нам необходимо изучить, - это ветвление и слияние. В SVN они очень похожи на создание тегов. Мы создаем бранч из общего родительского каталога, который содержит папки trunk, tags и branches, с помощью команды svn copy. Итак, давайте вернемся в родительский каталог, убедимся, что мы находимся в правильном месте, что в нем есть папки branches, tags и trunk, и выполним следующую команду: svn copy trunk branches\b1, наш бранч будет называться b1.

Опять же, вы можете убедиться, что бранч находится в состоянии ожидания, так как она еще не была создана. Мы снова делаем коммит и создаем ветку b1. Чтобы не прокручивать страницу вниз, выполните log more. Здесь мы увидим, что была создана ветка b1, и это изменение 6. Теперь вы заметите, что SVN не делает различия между другими бранчами и основным бранчем по номеру изменения.

Все обновления вносятся в тот же список изменений, каждое со своим номером. Так происходит потому, что номер изменения представляет изменение всего хранилища, а не только из одного файла. Итак, чтобы работать с бранчем, мы должны перейти в бранч b1 и сделать обновление. В нем мы добавим метод под названием feature1, No more available space, Look to the cloud, Your hard drive is full. Теперь сохраним его.

Теперь, если мы спросим у SVN статус, то увидим, что мы изменили файл f1.c и каталог branches/b1. Если мы вернемся в каталог trunk и спросим у SVN статус, вы увидите, что здесь изменений не было, то есть, эти каталоги независимы. Итак, теперь мы вернемся к бранчу и сделаем коммит.

Затем я выполню обновление с помощью сокращенной команды SVN, svn up. Здесь мы видим, Branch b1: Added feature 1. Вы можете заметить, что я поставил слова branch b1 перед сообщением коммита. Это необходимо, потому что Subversion не отслеживает, в какой ветке сделаны изменения, так что по соглашению нужно включать имя ветки в сообщение обновления. Итак, сейчас давайте поговорим о слиянии.

Если вы хотите продолжать работать в этой ветке (бранче) в течение длительного периода времени, вы захотите время от времени выполнять прямую интеграцию из основного бранча. Это время варьируется в зависимости от того, насколько быстро меняется основной бранч, если в нем работает кто-то еще. Как правило, это делается еженедельно. Прямая интеграция нужна для того, чтобы ваша ветка не слишком устарела по отношению к другим областям ПО, над которыми вы не работаете. В нашем случае основной бранч никто не меняет, поэтому мы будем выполнять только обратную интеграцию из ветки и сливать наши изменения в основной бранч. Итак, сначала мы просмотрим логи, чтобы увидеть, какие диапазоны изменений соответствуют нашему бранчу.

Как видите, мы создали ветку в изменении 6 и внесли обновление в изменении 7. Итак, сначала мы вернемся в корневой каталог нашего проекта, а затем с помощью команды svn merge скажем системе, что нужно объединить все версии, которые существуют в этой ветке. Итак, svn merge изменения с 6 по 7 из branches\b1 в trunk. Как и прежде, обратите внимание, что эта команда на самом деле не запишет изменения в хранилище, и мы все еще должны сделать коммит.

Но теперь, как вы можете видеть, вместо М (для modified), здесь стоит U (для updated), и в сообщении о слиянии система показывает, что она выполнила слияние и записала информацию о нем. Итак, теперь мы введем svn ci Merged changes from branch\b1 into trunk, и затем мы можем просмотреть изменение 8, в котором мы слили изменения из ветки b1 в основной бранч. Наша новая функция сейчас находится в основнойм бранче, и мы можем это доказать, если зайдем в каталог trunk и выведем f1.c.

Как видите, в файле есть и первое изменение, и новая функция. Итак, это основы ветвления и слияния. Очевидно, что ваш исходный код может быть намного сложнее, чем этот, и вы можете столкнуться с конфликтами, тогда вам придется разрешать их вручную с помощью инструментов дифференциации. Этот пример только показывает, что создавать бранчи не трудно, как и делать слияние изменений, если вы должным образом координируете свой проект. Как правило, у вас будет два вида бранчей. Вы будете создавать либо ветки для исправлений, либо ветки для новых функций.

Здесь мы создали ветку для новых функций, но иногда вы можете просто взять текущее состояние вашего продукта, создать ветку для исправлений, а затем отправить исправление обратно в продукт, в то время как кто-нибудь еще продолжит работать над основным бранчем и писать новые функции. Итак, мы заканчиваем работу с Subversion в командной строке и переходим к оболочной интеграции Subversion с помощью TortoiseSVN.