Почему трехстороннее слияние выгодно по сравнению с двухсторонним слиянием?
Wikipedia говорит, что трехстороннее слияние менее подвержено ошибкам, чем двухстороннее слияние, и часто время не требуется вмешательство пользователя. Почему это так?
Пример, когда трехстороннее слияние завершается успешно, и сбой 2-way слияния будет полезен.
Ответы
Ответ 1
Скажите, что вы и ваш друг проверили файл и внесли некоторые изменения в него. Вы удалили строку в начале, и ваш друг добавил строку в конце. Затем он передал свой файл, и вам нужно объединить его изменения в свою копию.
Если вы делали двусторонний слияние (другими словами, diff), инструмент мог сравнивать два файла и видеть, что первая и последняя строки разные. Но как он узнает, что делать с различиями? Если объединенная версия включает первую строку? Должна ли она включать последнюю строку?
С трехсторонним слиянием он может сравнивать два файла, но он также может сравнивать каждый из них с исходной копией (прежде чем вы изменили ее). Таким образом, он может видеть, что вы удалили первую строку и что ваш друг добавил последнюю строку. И он может использовать эту информацию для создания объединенной версии.
Ответ 2
Этот слайд из презентации perforce интересен:
![alt text]()
Существенная логика инструмента трехстороннего слияния проста:
- Сравнить базовые, исходные и целевые файлы
- Определите "куски" в файле исходных файлов и целевых файлов:
- Куски, не соответствующие базе
- Куски, которые соответствуют базе
- Затем составьте объединенный результат, состоящий из:
- Куски, которые соответствуют друг другу во всех трех файлах
- Куски, которые не соответствуют базе ни в источнике, ни в целевой, но не в обеих
- Куски, которые не совпадают с базой, но которые соответствуют друг другу (т.е. они были изменены одинаково как в исходном, так и в целевом объекте).
- Заполнители для кусков, которые конфликтуют, которые должны быть разрешены пользователем.
Обратите внимание, что "куски" на этом рисунке являются чисто символическими. Каждый из них может представлять строки в файле или узлы в иерархии или даже файлы в каталоге. Все зависит от того, на что способен конкретный инструмент слияния.
Возможно, вы задаетесь вопросом, какую выгоду предлагает трехстороннее слияние при слиянии с двумя путями. На самом деле, нет такой вещи, как двухстороннее слияние, только инструменты, которые различают два файла и позволяют вам "сливаться", выбирая куски из одного файла или другого.
Только трехстороннее слияние дает вам возможность узнать, является ли фрагмент изменением от начала координат и не изменяется ли конфликт.
Ответ 3
Я написал очень подробное сообщение об этом. В принципе вы не можете отслеживать удаление/добавление с двухсторонним, очень, очень непродуктивным.
Ответ 4
Три способа слияния, когда два набора изменений в один базовый файл объединяются по мере их применения, в отличие от применения одного, а затем слияние результата с другим.
Например, наличие двух изменений, в которые строка добавляется в одно и то же место, может быть интерпретирована как два дополнения, а не изменение одной строки.
Например
Файл 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' (с 2-сторонним слиянием)
#diff b, c
dog
--- mouse
+++ moose
cat