Почему объединение ряда ревизий отличается от объединения их по отдельности? - PullRequest
4 голосов
/ 09 октября 2010

Я пытался разобраться в слиянии / реинтеграции SVN и прочитал следующие статьи / книги:

http://svnbook.red -bean.com / ru / 1.5 / index.html
http://blogs.open.collab.net/svn/2008/07/subversion-merg.html

Я, очевидно, не совсем понял, так как не могу понять, почему включая синхронизированные ревизии при слиянии назад с транком (отражающий / циклическийпроблема слияния) - я вижу обоснование не , исключая ревизию.

Если строка файла A на соединительной линии объединяется с файлом A 'на ветви, а затем объединяется обратнок магистрали, то, конечно, нет никакой разницы между А и А ', так что нет конфликта?Почему возникает проблема «[объединение] обратных изменений, которые уже существуют в транке »?

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

  1. Фиксация изменений в соединительной линии(r4)
  2. Объединить r4 в ветвь и зафиксировать (r5)
  3. Передать изменение в ветвь (r6)
  4. Слить ответвленную ветвь в ствол одним из следующих способов:
    • Слияние диапазона ревизий r5-r6 с транком - возникают конфликты, или
    • Слияние r5 с транком, затем слияние r6 с транком - конфликтов не возникает

Я использую SmartSVN 6.6 и SVN 1.6.Почему при объединении диапазона ревизий возможны разные результаты по сравнению с слиянием каждой ревизии в отдельности?И, в конечном итоге, почему включение отражающих слияний является проблемой?

1 Ответ

5 голосов
/ 27 октября 2010

Краткий ответ на основе моих наблюдений за поведением слияния подрывных процессов (не знание книги / источника):

  1. Слияния с явные изменения кажутсябыть полностью не осведомленным о более ранних слияниях и будет повторно применять изменения так же часто, как вы делаете слияние.

  2. «Обычное» слияние без диапазона ревизий знает о том, какие ревизии уже были слиты (дляТО целевая ветка).Обычно изменения не будут применены дважды.Однако он не проверяет, произошло ли изменение, которое должно быть объединено, в той же ветви, которая сейчас является целью объединения.Когда это происходит, в нем происходит какое-то контекстно-зависимое слияние, но конфликты, тем не менее, будут возникать чаще.

  3. merge --reintegrate способен обнаруживать изменения, которые произошли в прошлом объекта слиянияи не будет повторно применять те.К сожалению, реинтеграция работает только для функциональных ветвей.

Я стараюсь избегать любых слияний типа 1. как можно больше.2. Тип «обычные» слияния можно приручить, объединяя только в одном направлении.Проблемы начинаются, когда вы сливаетесь вверх и вниз снова.Всякий раз, когда мне нужно «перекрестное слияние», как в сценарии ветвления объектов, я использую тип слияния 3. или вишневый выбор с блокировкой ревизии (явное слияние диапазона ревизий с --record-only)

SVN просто не может быть замененподдерживать широкий спектр операций слияния "вслепую" :).Ни одна VCS никогда не сможет разрешить все конфликтующие человеческие решения.

Почему svn конфликты слияний

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

Слияния до 1.5 SVN выглядели бы так:

(HEAD версия ветки 510) svn merge -r500: 510 http://server.tld/branches/stable-1.0

следующее слияние будет:

(HEAD версия ветки 520) svn merge -r510:520 http://server.tld/branches/stable-1.0

Этот синтаксис все еще действует и работает.

Вы можете прочитать о том, что я описал в рекомендациях SVN 1.4: (Внимание, устаревшая ссылка!) http://svnbook.red -bean.com / ru / 1.4 / svn.branchmerge.copychanges.html # svn.branchmerge.copychanges.bestprac.track

С функциями слияния, которые были представлены в SVN 1.5, он началоценить некоторые из ваших намерений.Например, теперь SVN выполнит математику определения диапазонов для автоматического слияния и отслеживания того, что и где было объединено.Меньше накладных расходов, меньше конфликтов из-за человеческих ошибок.Но при использовании множества веток вы все равно можете применить изменение дважды .Subversion сохранила эту способность.

Как жить с ней

Сбор вишни, который вы делаете в своем 4-шаговом примере, держит ваш ствол и ветвь довольно "туго".На шаге 3 ваши две ветви идентичны, поэтому объединение на шаге 4 больше не имеет смысла.Я знаю, что вы упростили, и в реальном сценарии будет больше изменений.Но основная идея веток Subversion - отделиться.Устойчивый к нестабильной, несовместимой разработке, нестандартным сборкам ...

Необходимость выбора или перекрестного объединения часто является лишь признаком недостаточно продуманной политики ветвления и использования ветвлений.

Если филиалы часто пересекаются с изменениями, возможно, вы сможете сделать их одним.

Я перестану читать лекции ;-), надеясь, что я вас не слишком смутил.

Если выХотите узнать больше о лучших практиках SVN, возможно, вы найдете их в моих SO-Ответах или в Красной книге SVN.Я могу опубликовать вам диаграмму о правильном подборе вишни, если это проблема для вас.

ура

...