Почему трехстороннее слияние выгодно по сравнению с двухсторонним слиянием?

Wikipedia говорит, что трехстороннее слияние менее подвержено ошибкам, чем двухстороннее слияние, и часто время не требуется вмешательство пользователя. Почему это так?

Пример, когда трехстороннее слияние завершается успешно, и сбой 2-way слияния будет полезен.

Ответ 1

Скажите, что вы и ваш друг проверили файл и внесли некоторые изменения в него. Вы удалили строку в начале, и ваш друг добавил строку в конце. Затем он передал свой файл, и вам нужно объединить его изменения в свою копию.

Если вы делали двусторонний слияние (другими словами, diff), инструмент мог сравнивать два файла и видеть, что первая и последняя строки разные. Но как он узнает, что делать с различиями? Если объединенная версия включает первую строку? Должна ли она включать последнюю строку?

С трехсторонним слиянием он может сравнивать два файла, но он также может сравнивать каждый из них с исходной копией (прежде чем вы изменили ее). Таким образом, он может видеть, что вы удалили первую строку и что ваш друг добавил последнюю строку. И он может использовать эту информацию для создания объединенной версии.

Ответ 2

Этот слайд из презентации perforce интересен:

alt text

Существенная логика инструмента трехстороннего слияния проста:

  • Сравнить базовые, исходные и целевые файлы
  • Определите "куски" в файле исходных файлов и целевых файлов:
    • Куски, не соответствующие базе
    • Куски, которые соответствуют базе
  • Затем составьте объединенный результат, состоящий из:
    • Куски, которые соответствуют друг другу во всех трех файлах
    • Куски, которые не соответствуют базе ни в источнике, ни в целевой, но не в обеих
    • Куски, которые не совпадают с базой, но которые соответствуют друг другу (т.е. они были изменены одинаково как в исходном, так и в целевом объекте).
    • Заполнители для кусков, которые конфликтуют, которые должны быть разрешены пользователем.

Обратите внимание, что "куски" на этом рисунке являются чисто символическими. Каждый из них может представлять строки в файле или узлы в иерархии или даже файлы в каталоге. Все зависит от того, на что способен конкретный инструмент слияния.

Возможно, вы задаетесь вопросом, какую выгоду предлагает трехстороннее слияние при слиянии с двумя путями. На самом деле, нет такой вещи, как двухстороннее слияние, только инструменты, которые различают два файла и позволяют вам "сливаться", выбирая куски из одного файла или другого.
Только трехстороннее слияние дает вам возможность узнать, является ли фрагмент изменением от начала координат и не изменяется ли конфликт.

Ответ 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