Delphi и TrortoiseSVN. Ручная правка конфликтов

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

Создание проекта

Создадим проект VCL и импортируем его на сервер VisualSVN в директорию trunk.

Project1.exe > Add to Version Control > Subversion >

2

Теперь добавим кнопку на форму и сделаем Commit прямо из Delphi

3

 

4

 

5

Если посмотрим на лог прямо из Delphi, то увидим следующее

6

 

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

 

Теперь выделим отдельную ветвь проекта – сделать это проще всего через TortoiseSVN.

Правой кнопкой жмем на папке, в которой у нас проект, далее TortoiseSVN>Branch/Tag…

7

 

 

Далее переключаемся на работу с ветвью

Правой кнопкой жмем на папке, в которой у нас проект, далее TortoiseSVN>Switch…  Руками прописываем директорию, в которую нужно попасть

8

Теперь на форме удалим TRUNC Button и добавим Edit BRANCH

9

В принципе вот эта ситуация и вызовет конфликт в дальнейшем. Ведь часто в проектах старая часть не удаляется, а либо изменяется, либо дописывается. А мы здесь удалили кнопку.

Делаем Commit из Delphi, смотрим лог

10

 

Вызов конфликта

Теперь попробуем сделать Merge для 65 и 67 ревизий. Вернемся в Trunk через Switch.

Правой кнопкой жмем на папке, в которой у нас проект, далее TortoiseSVN>Switch…

11

 

Здесь у нас на форме тоже, что мы и оставляли…

12

Теперь попробуем сделать Merge.

Правой кнопкой жмем на папке, в которой у нас проект, далее TortoiseSVN>Merge..

13

 

 

Нужно указать конкретную ревизию и ветвь, из которой будем загружать данные для слияния

15

 

16

В результате получим следующее

17

 

TortoiseSVN подумал, что мы просто переписываем версией из ветви версию в стволе. Но это не так, откатимся до 65 версии в стволе. Ещё раз перейдем в ветвь – изменим что нибудь там, например габариты Edit и прокомиттим её. Вернемся в ствол и попробуем сделать слияние – получим следующий конфликт…

19

Попробуем нажать на Edit Conflict и разрешить его.

Получаем вот такое вот мясо…

20

 

Ясно, что тут всё перемешано! И возможна только ручная правка…

Ручное решение конфликта

Для правки я воспользовался вот этим вот редактором, из 2-х частей составил третью

22

Готовый текст в ручную вставил в Unit1.dfm через блокнот и тогда всё заработало как нужно.  На форме оказался элемент TrunkButton и BRANCH Edit. Этих сложностей не было бы, если бы мы не удалили кнопку после выведения в ветвь из основного проекта, но тогда и не было бы конфликта и иллюстрации того, что модель слияния не так проста как кажется. Я так понимаю могут возникнуть случаи, где надо будет крепко подумать.

21