Различия между SVN слияния влево, вправо и рабочие файлы после конфликтов - PullRequest
37 голосов
/ 06 октября 2011

При выполнении 'svn merge' из ствола моей команды разработчиков в ветку мы иногда сталкиваемся с конфликтами слияния, которые приводят к файлам с именами суффиксов: *.merge-right.r5004, *.merge-left.r4521 и *.working. Я искал всю документацию Subversions, но их объяснение не очень пригодилось. Я собрал следующее:

  • *. Merge-right.r5004 = версия соединительной линии
  • *. Merge-left.r4521 =?
  • *. Работает = версия филиала

Кажется, я не могу понять, что такое merge-left.r4521. И если ответ таков, что это просто более старая версия файла из филиала, то почему 4521?

Ответы [ 5 ]

47 голосов
/ 31 мая 2016

Скажем, есть две ветви, и последняя (HEAD) ревизия в ветви A равна 9, тогда как в ветви B. это 6 единиц.

Когда выполняется cd B; svn merge -r 5:8 ^/braches/A, svn попытается применить дельту между5 и 8 из ветви A поверх ветви B.

(Другими словами, наборы изменений 7 и 8 будут применены к B)

common
ancestor      left     right
(1)━━┱───(3)──(5)──(7)──(8)──(9)  # branch A
     ┃         └┄┄┄┄┬┄┄┄┄┘
     ┃              ↓
     ┗━(2)━━(4)━━(6)              # branch B
               working

Если применяется дельтачисто, все хорошо.

Допустим, некоторые строки были изменены в наборе изменений 3, и те же строки источника были изменены по-разному в наборе изменений 4.

Если дельта (5 → 8) не касаетсяэти строки, все еще хорошо.

Если дельта (5 → 8) также изменила то, что сделали 3 и 4, изменения не могут быть объединены автоматически, и svn оставляет файл в состоянии конфликта:

  • file --- файл с (рабочим, левым, правым) разделителем
  • file.working --- состояние файла в ветви B @ 6
  • file.merge-left -- состояние файла в ветви A @ 5
  • file.merge-right --- состояние файла в ветви A @ 8

Если вы редактируете такой файл maв действительности, у вас есть несколько вариантов: продолжайте «работать» (ваша версия), сохраняйте «право» (их версия;другой версии ветки) или объедините изменения вручную.

«Слева» само по себе бесполезно, нет смысла оставлять «левую» (их старую версию) в файле.

ЭтоОднако полезно для инструментов.«left → right» - это набор изменений.

Когда вы видите, например:

<<<<<<< .working
foo = 13
||||||| .merge-left.r5
foo = "13"
=======
foo = "42"
>>>>>>> .merge-right.r8

Это говорит вам, что "13" было изменено на "42" в ветви A.

В ветви B было 13 (целое число, а не строка).

Скорее всего, вы выберете ручное слияние для изменения 13 на 42 и сохраните его целым числом.

13 голосов
/ 01 октября 2012

file.merge-left.r4521 - это последнее изменение этого файла в левой ветви (т. Е. В источнике). до создания правой ветви (назначения).

Другими словами, merge-left.r4521 это первая версия файла для объединения

с merge-right.r5004 (последняя версия конечной ветви)

Например, , скажем, вы хотите объединить ветви влево и вправо, как показано ниже:

Left   1   2   f.3   4   f.5   6    7    f.9    11 

Right                                  8    f.10    f.12   13


Right is created in 8 ( is a copy of 7 )

file 'f' has been modified in 3, 5, 9, 10, 12

The merge of file 'f' will occur between 7 and 13 because

7 is the latest version of file f in Left before Right was created

13 is the latest version of Right
9 голосов
/ 02 марта 2012
  • 'file.py.merge-left.rxxx` показывает результат объединения, принимающий левую сторону конфликта
  • 'file.py.merge-right.ryyy` показывает результат объединения с правой стороны конфликта
  • 'file.py.working` показывает вашу неизменную рабочую копию
  • 'file.py` показывает попытки SVN объединить оба

Этот вопрос похож на stackoverflow.com / questions / 1673658 / svnmerge-workflow , но этот вопрос более конкретно касается содержимого файлов конфликтов.

0 голосов
/ 18 марта 2014

Похоже, что "левый" файл является последней версией, где файл был одинаковым в транке и ветви (по вашему вопросу, но это было бы между источником и dest в целом).

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

Левая и правая - это то, что используется для создания diff, который будет применен (как патч) к рабочему файлу.

0 голосов
/ 07 октября 2011

Вы выполнили трехстороннее разрешение конфликтов слияния (при объединении 2 разных файлов ). В этой операции использовались 3 источника

  • "ваш" файл (из WC или source-location, в зависимости от параметров)
  • "свой" файл (файл с изменениями должен быть объединен)
  • «базовый» файл (общий предок файлов 1-2)

r *** расширение только что добавлено к тому же имени файла, чтобы иметь 3 файла при слиянии

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...