Что делает некоторые системы контроля версий лучше при слиянии?

Я слышал, что многие из распределенных VCS (git, mercurial и т. Д.) Лучше подходят для слияния, чем традиционные, такие как Subversion. Что это значит? Что они делают, чтобы слияние было лучше? Можно ли это сделать в традиционной системе контроля версий?

Бонусный вопрос: уравнивает ли SVN 1.5 отслеживание слияния игровое поле вообще?


person JW.    schedule 20.01.2009    source источник
comment
Некоторое время назад я задал аналогичный вопрос, который может вам пригодиться: http://stackoverflow.com/questions/43995/why-is-branching-and-merging-easier-in-mercurial-than-in-subversion   -  person Nick Pierpoint    schedule 20.01.2009


Ответы (5)


Похоже, что большинство ответов касается Subversion, так что здесь у вас есть один о Git (и других DVCS).

В распределенной системе контроля версий, когда вы объединяете одну ветвь с другой, вы создаете новую фиксацию слияния, которая запоминает, как вы разрешили слияние, и запоминает всех родителей слияния. Эта информация просто отсутствовала в Subversion до версии 1.5; для этого вам пришлось использовать дополнительные инструменты, такие как SVK или svnmerge. Эта информация очень важна при повторном слиянии.

Благодаря этой информации распределенные системы контроля версий (DVCS) могут автоматически находить общего предка (или общих предков), также известного как база слияния, для любых двух ветвей. Взгляните на схему исправлений ASCII-art ниже (я надеюсь, что она не была слишком сильно искажена),

---O---*---*----M---*---*---1
     \                /
       \---*---A/--*----2

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

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

Вы можете найти информацию о слиянии в Subversion 1.5. в Выпуск Subversion 1.5 Примечания. Примечания: вам нужны разные (!) Параметры для объединения ветки в магистраль, чем для объединения магистрали в ветку, иначе. не все ветви равны (в распределенных системах контроля версий они [обычно] технически эквивалентны).

person Community    schedule 27.01.2009

Возможности слияния SVN приличные, и простые сценарии слияния работают нормально - например, ветвь выпуска и ствол, где ствол отслеживает коммиты на RB.

Более сложные сценарии быстро усложняются. Например, давайте начнем со стабильной ветки (stable) и trunk.

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

Итак, вы создаете ветвь demo, и граф слияния выглядит так:

  • stable -> demo -> trunk (ты)
  • stable -> trunk (другие разработчики)

Но что происходит, когда вы объединяете изменения из stable в demo, а затем объединяете demo в trunk, в то время как другие разработчики также объединяют stable в trunk? SVN путает слияния из stable, которые дважды объединяются в trunk.

Есть способы обойти это, но с git / Bazaar / Mercurial этого просто не происходит - они понимают, были ли уже объединены коммиты, потому что они идентифицируют каждую фиксацию по путям слияния, которые она принимает.

person orip    schedule 20.01.2009

Отслеживание слияния в 1.5 лучше, чем отсутствие слияния, но это все еще ручной процесс. Мне действительно нравится, как он записывает, какие ревизии объединены, а какие нет, но это далеко не идеально.

Слияние имеет приятный диалог в 1.5. Вы можете выбрать, какие ревизии вы хотите объединить по отдельности или целую ветку. Затем вы запускаете слияние, которое происходит локально (и занимает НАВСЕГДА), когда затем вы получаете кучу файлов для чтения. Вам необходимо логически проверить каждый файл на правильное поведение (желательно с помощью модульных тестов файлов), и если у вас есть конфликты, вы должны их разрешить. Как только вы будете довольны, вы совершите фиксацию своего изменения, и в этот момент ветвь будет считаться объединенной.

Если вы сделаете это по частям, SVN запомнит то, что вы ранее сказали, что вы объединились, что позволит вам объединиться. Однако я нашел процесс и результат некоторых слияний странными, мягко говоря ...

person Spence    schedule 20.01.2009

Эти системы контроля версий могут работать лучше, потому что у них больше информации.

SVN pre-1.5, как и большинство VCS до последнего поколения, на самом деле не помнит, что вы где-то объединили два коммита. Он помнит, что у этих двух ветвей был общий предок, когда они впервые разветвились, но он не знает о каких-либо более поздних слияниях, которые можно было бы использовать в качестве общей основы.

Я ничего не знаю о сообщении SVN 1.5, так что, возможно, они улучшили это.

person Peter Burns    schedule 20.01.2009
comment
Ознакомьтесь с revctrl.org/CategoryMergeAlgorithm для некоторых (беглых) описаний алгоритмов слияния. Некоторые из этих алгоритмов усложняют использование истории ориентированного ациклического графа, которую SVN просто не хранит. Не забудьте также объединить / переименовать деревья каталогов /. - person joeforker; 20.01.2009

Беспокойный ответ: почему одни языки программирования лучше справляются с текстом / математикой, чем другие?

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

По контракту с SVN вы делаете что-то необычное (и неправильное?), Если когда-либо в конечном итоге объединяете что-то, в чем вы не писали ту или иную сторону.

IIRC большинство VCS могут выполнять слияние с тем, что вы их просите использовать, поэтому (теоретически) нет ничего, что мешает SVN использовать механизмы слияния GIT / mercurial. YMMV

person BCS    schedule 20.01.2009
comment
Возможно, мне следовало спросить чем они лучше, чем почему. Интересный момент об аутсорсинге слияния. - person JW.; 20.01.2009
comment
Это глупо, у всех систем контроля версий есть эта проблема. С SVN это всегда вовремя. У вас есть некоторые изменения, которые вы хотите зарегистрировать, и - сюрприз! - кто-то уже внес конфликтующие изменения. Вы должны зафиксировать как свои изменения, так и объединить их изменения в одну фиксацию. - person Peter Burns; 20.01.2009
comment
@Peter Burns: С SVN у вас почти всегда есть один из авторов, выполняющих слияние. С Git / Hg / etc слияние может быть выполнено кем-то, кто не писал ни одной из сторон. Я отредактирую, чтобы сделать это более понятным. - person BCS; 20.01.2009
comment
Я все еще не согласен с вашим новым постом. Единственный раз, когда слияние выполняется в git et al. это когда вы явно объединяете два расходящихся дерева. Правда, SVN вынуждает автора выполнить слияние до того, как он совершит коммит, но если вы используете ветки в SVN, то у вас есть такой же потенциал для слияния, которое будет выполнено третьей стороной. - person Peter Burns; 20.01.2009
comment
@Peter Burns: Случаи веток не являются нормой, и, если я правильно понимаю, как вы должны их использовать, ветка принадлежит кому-то, кто вкладывается в внесенные в нее изменения, а также, скорее всего, будет человек, выполняющий слияние обратно. С git это не так. - person BCS; 21.01.2009
comment
Если я правильно понимаю git, любая фиксация - это когда-либо слияние двух расходящихся деревьев. Если нет, то, наверное, я не вижу основной рациональности для git et al. - person BCS; 21.01.2009
comment
Похоже, вас ввели в заблуждение. Только некоторые коммиты в git являются слияниями. Следует уточнить, что в распределенных VCS существует различие между фиксацией изменений и их публикацией. - person Peter Burns; 12.02.2009
comment
s / commit / принятие публикаций / до последнего. Помимо номенклатуры, я думаю, что моя точка зрения все еще остается в силе: распределенная VCS в конечном итоге объединяет 2 сторонних редактирования намного больше, чем традиционные. - person BCS; 12.02.2009
comment
Хорошо, я явно повторяю свою точку зрения, так что это последний комментарий, который я сделаю. Третья сторона, объединяющая код двух других людей, часто является плохой идеей, и распределенные системы контроля версий не должны этого делать. Я использую git год, но мне никогда не приходилось объединять код двух других людей, и я этого не видел. - person Peter Burns; 13.02.2009