Почему трехстороннее слияние выгоднее двухстороннего слияния?
Википедия говорит, что трехстороннее объединение менее подвержено ошибкам, чем двухстороннее, и часто не требует вмешательства пользователя. Почему это так?
Будет полезен пример, когда трехстороннее слияние завершается успешно, а двухстороннее слияние завершается неудачно.
5 ответов
Допустим, вы и ваш друг извлекли файл и внесли в него некоторые изменения. Вы удалили строку в начале, а ваш друг добавил строку в конце. Затем он передал свой файл, и вам нужно объединить его изменения в вашу копию.
Если вы выполняли двухстороннее слияние (другими словами, diff), инструмент мог сравнить два файла и увидеть, что первая и последняя строки различны. Но как он узнает, что делать с различиями? Должна ли объединенная версия включать первую строку? Должен ли он включать последнюю строку?
При трехстороннем слиянии он может сравнивать два файла, но также может сравнивать каждый из них с исходной копией (до того, как кто-либо из вас изменил ее). Таким образом, он может видеть, что вы удалили первую строку, а ваш друг добавил последнюю строку. И он может использовать эту информацию для создания объединенной версии.
Этот слайд из презентации перформанса интересен:
Основная логика трехстороннего инструмента слияния проста:
- Сравните базовые, исходные и целевые файлы
- Определите "чанки" в исходном и целевом файлах:
- Куски, которые не соответствуют основанию
- Куски, которые соответствуют основанию
- Затем соберите объединенный результат, состоящий из:
- Куски, которые соответствуют друг другу во всех 3 файлах
- Куски, которые не соответствуют основанию ни в источнике, ни в цели, но не в обоих
- Куски, которые не соответствуют основанию, но соответствуют друг другу (то есть они были одинаково изменены как в источнике, так и в цели)
- Заполнители для блоков, которые конфликтуют, должны быть разрешены пользователем.
Обратите внимание, что "куски" на этой иллюстрации являются чисто символическими. Каждый из них может представлять строки в файле, или узлы в иерархии, или даже файлы в каталоге. Все зависит от того, на что способен конкретный инструмент слияния.
Вы можете спросить, какое преимущество предлагает трехстороннее слияние перед двухсторонним. На самом деле не существует такой вещи, как двустороннее слияние, только инструменты, которые различают два файла и позволяют вам "объединять", выбирая фрагменты из одного или другого файла.
Только трехстороннее слияние дает вам возможность узнать, является ли чанк изменением от источника и конфликтует ли изменение.
Трехстороннее объединение, при котором два набора изменений в один базовый файл объединяются по мере их применения, в отличие от применения одного, а затем слияния результата с другим.
Например, наличие двух изменений, в которых строка добавляется в одном и том же месте, может интерпретироваться как два добавления, а не как изменение одной строки.
Например
Файл a был изменен двумя людьми, один добавил лося, другой добавил мышь.
#File a
dog
cat
#diff b, a
dog
+++ mouse
cat
#diff c, a
dog
+++ moose
cat
Теперь, если мы объединяем наборы изменений по мере их применения, мы получим (трехстороннее объединение)
#diff b and c, a
dog
+++ mouse
+++ moose
cat
Но если мы применим b, то посмотрим на изменение с b на c, это будет выглядеть так, как будто мы просто меняем 'u' на 'o' (двухстороннее слияние)
#diff b, c
dog
--- mouse
+++ moose
cat
Я написал очень подробный пост об этом. По сути, вы не можете отслеживать удаление / добавление с двухсторонней, очень, очень непродуктивной.
Говорят: «Картина рисует тысячу слов».
Заимствовано из AWS CodeCommit: Инструменты разработчика> CodeCommit> Репозитории> Имя репозитория> Запросы на извлечение> Имя запроса на извлечение> Слияние