Практическое руководство по слиянию веток Subversion - PullRequest
8 голосов
/ 18 декабря 2009

Введение

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


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

Основываясь на прочтении различных связанных вопросов переполнения стека, я определил Sourcegear DiffMerge и Beyond Compare в качестве возможных инструментов для выполнения трехстороннего слияния. Я попробовал DiffMerge, но изо всех сил пытался использовать его эффективно. Я ожидал увидеть следующие три файла при разрешении конфликтов

  • Файл из ветви A
  • Файл из ветки B
  • Результат выполнения слияния

Но вместо этого я вижу

  • Файл из ветки A
  • Файл из ветки B
  • Общий предок A и B, базовая версия AKA

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

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

Ответы [ 3 ]

5 голосов
/ 18 декабря 2009

На самом деле, существуют инструменты слияния с двумя и тремя путями. В двухстороннем режиме должны отображаться три окна. Исходная версия ветви A, целевая версия ветви B и результат слияния. Трехстороннее слияние покажет базовую версию в дополнение к этому. Вы можете представить трехстороннее слияние как уравнение Result = Target + (Base - Source). По сути, алгоритм вычислит набор различий между базой и источником и другой набор между базой и целью, а затем вычеркнет все различия, общие для обоих. Затем он покажет вам список оставшихся различий для принятия решения. Для различий в исходном или целевом объекте, где тот же фрагмент кода не затрагивается в другой ветви, он автоматически принимает предварительное решение об использовании соответствующего различий. Если различия находятся в одном и том же разделе кода в обеих ветвях, различия помечаются как конфликты, и ваш инструмент обычно проводит вас через конфликты один за другим. Конфликты не определены заранее, и код не появится в файле результатов, пока вы не примете решение. Вы получаете возможность перейти к следующему различию или к следующему конфликту. Все конфликты должны решаться вами. Основываясь на ваших знаниях, иногда вы хотите откатить (переопределить) даже не конфликтующие различия, чтобы завершить слияние.

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

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

3 голосов
/ 18 декабря 2009

Вы можете установить KDiff3 для выполнения трехстороннего слияния с TortoiseSVN. Он автоматически интегрируется с TortoiseSVN на платформе Windows.

В трех файлах, которые он показывает, вы являетесь общим предком обеих ветвей: файла из ветви A и файла из ветви B. Затем вы разрешаете конфликты в файле, представляющем ветвь, с которой вы объединяете.

Я считаю, что это очень интеллектуальный инструмент, и в обычных случаях он автоматически выберет правильный вариант для объединения простых конфликтов.

Когда он не уверен, вас спросят, что делать.

У меня иногда возникали проблемы, когда он выбирал неправильный путь. Это были случаи, когда путь ветвления / слияния был довольно сложным.

И, как сказал GrayWizard, иногда проще просматривать необработанный файл. Subversion создаст один необработанный файл в ветке, к которой вы добавляете разметку, чтобы показать, какие изменения были внесены в какую ревизию. Мне нужно один или два раза открыть этот файл в моей среде IDE и исправить его оттуда.

1 голос
/ 18 декабря 2009

Perforce имеет инструмент слияния, который покажет вам все четыре версии (базовая, A, B и слияние) и наглядно покажет, как будет выглядеть ваше слияние.

При выполнении сложных слияний я на самом деле считаю полезным просто посмотреть на необработанный файл (при условии, что это не байтовые данные) и сравнить части ревизии самостоятельно. Если ваше слияние очень сложное (то есть перекрывающиеся слияния, перемещенный код и т. Д.), Это может быть единственным способом сделать это.

Еще одна вещь, которую я видел, состоит в том, чтобы экспортировать одну копию рабочего набора, а затем вручную объединить с помощью параллельного инструмента (например, Beyond Compare ), а затем просто выполнить прямую проверку -в.

Единственное, что всегда вызывало у меня слияния, это то, что они были отстали от того, что я ожидал. Это всегда вызывало у меня проблемы с базовой ревизией.

...