Какая разница между SVN и Git для слияния?

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

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

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

Привет, мир!

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

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

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

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

Затем пользователь2 совершает, то пользователь1 совершает, SVN даст вам конфликт. Может ли Git решить что-то простое?

Ответы

Ответ 1

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

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

Это позволяет git запомнить то, что уже слилось, что значительно сокращает появление конфликтов.

DAG

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


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

Ответ 2

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

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

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

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