Каково различие между SVN и Мерзавцем для слияния?

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

Как Мерзавец обрабатывает слияние лучше?Как это работает?

Например, в SVN, если у меня есть следующая строка:

Привет, мир!

Затем user1 изменяет его на:

Привет, мир! 1

затем user2 изменяет его на:

Привет, мир! 12

Затем фиксации user2, затем user1 фиксации, SVN дал бы Вам конфликт. Мерзавец может разрешить что-то простое как это?

24
задан Jon Seigel 23 April 2010 в 14:22
поделиться

2 ответа

Конкретный конфликт, который вы упомянули, всегда неразрешим. У инструмента слияния просто нет способа узнать, какую версию следует сохранить.

Однако Git, вероятно, лучше SVN в разрешении конфликтов. Его основная стратегия слияния - рекурсивная, которая находит общего предка двух коммитов, изменяющих один и тот же файл, и выполняет трехстороннее слияние. Он также имеет встроенные возможности для записи и повторного использования разрешений конфликтов ( git-rerere ) и множество других стратегий слияния для особых случаев.

Преимущество Git в слиянии в том, что это часть истории. Коммит слияния - это коммит с двумя родителями. Модель истории Git (ориентированный ациклический граф) предполагает, что будут такие коммиты. Это означает, что дальнейшие слияния в будущем будут работать именно так, как должны. Всегда. (Да, иногда бывают конфликты, но это настоящие конфликты, а не неспособность обработать слияние.)

SVN, с другой стороны, просто пытается отследить, где произошло слияние, но его модель по-прежнему по своей сути линейна. История по-прежнему содержит только одну строку коммитов, а информация об отслеживании слияний дает дополнительную помощь. Из того, что я слышал, SVN не всегда может правильно обрабатывать более сложные шаблоны слияния. (Одним из примеров является отражающее слияние - слияние A с B, затем B с A.)

18
ответ дан 28 November 2019 в 23:23
поделиться

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

Как упоминалось в Почему слияние в git лучше, чем SVN , реальная разница заключается в записи истории коммитов:

​​Это позволяет Git запоминать то, что уже было объединено, что значительно снижает вероятность конфликтов.

DAG

Итак, когда приходит время выполнить слияние от 5b до ветви (a), мы можем использовать информацию в DAG, чтобы знать, что 3b и 2b уже выполнены.


Итак, это рабочий процесс слияния , что Git будет обрабатывать намного более изящно, чем SVN:
См. Merge Git vs. SVN для конкретных примеров.

28
ответ дан 28 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: