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

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

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

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

Привет, мир!

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

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

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

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

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

2 ответа

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

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

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

DAG

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


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

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

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

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

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

Другие вопросы по тегам