Почему трехстороннее слияние выгоднее двухстороннего слияния? - PullRequest
135 голосов
/ 09 ноября 2010

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

Был бы полезен пример, когда трехстороннее объединение завершается успешно и двухстороннее объединение не удается.

Ответы [ 4 ]

216 голосов
/ 09 ноября 2010

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

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

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

66 голосов
/ 09 ноября 2010

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

slide image

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

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

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

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

19 голосов
/ 04 января 2011

Я написал очень подробный пост об этом . По сути, вы не можете отслеживать удаления / добавления с помощью двухсторонней, очень, очень непродуктивной.

14 голосов
/ 09 ноября 2010

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

Например, наличие двух изменений, в которых строка добавляется в одном месте, можно интерпретировать как два добавления, а не как изменение одной строки.

Например

Файл

был изменен двумя людьми, один добавил лося, другой добавил мышь.

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...