Краткий ответ на основе моих наблюдений за поведением слияния подрывных процессов (не знание книги / источника):
Слияния с явные изменения кажутсябыть полностью не осведомленным о более ранних слияниях и будет повторно применять изменения так же часто, как вы делаете слияние.
«Обычное» слияние без диапазона ревизий знает о том, какие ревизии уже были слиты (дляТО целевая ветка).Обычно изменения не будут применены дважды.Однако он не проверяет, произошло ли изменение, которое должно быть объединено, в той же ветви, которая сейчас является целью объединения.Когда это происходит, в нем происходит какое-то контекстно-зависимое слияние, но конфликты, тем не менее, будут возникать чаще.
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.Я могу опубликовать вам диаграмму о правильном подборе вишни, если это проблема для вас.
ура