У Вікіпедії кажуть, що трехстороннє злиття менш схильне до помилок, ніж двостороннє злиття, і часто не потребує втручання користувача. Чому це так?
Приклад, коли 3-х напрямне злиття є успішним, а двостороннє злиття не вдається.
У Вікіпедії кажуть, що трехстороннє злиття менш схильне до помилок, ніж двостороннє злиття, і часто не потребує втручання користувача. Чому це так?
Приклад, коли 3-х напрямне злиття є успішним, а двостороннє злиття не вдається.
Відповіді:
Скажімо, ви та ваш друг перевірили файл та внесли в нього деякі зміни. Ви видалили рядок на початку, а ваш друг додав рядок наприкінці. Потім він вчинив свій файл, і вам потрібно об'єднати його зміни у свою копію.
Якщо ви робили двостороннє злиття (іншими словами, diff), інструмент міг порівняти два файли та побачити, що перший і останній рядки різні. Але як би знати, що робити з відмінностями? Чи повинен об'єднана версія містити перший рядок? Чи повинен він включати останній рядок?
За допомогою тристороннього злиття він може порівнювати два файли, але також може порівнювати кожен із них з оригінальною копією (перш ніж хтось із вас змінив її). Так видно, що ви видалили перший рядок, і що ваш друг додав останній рядок. І вона може використовувати цю інформацію для створення об'єднаної версії.
Цей слайд із презентації перфорсу цікавий:
Основна логіка інструменту тристороннього злиття проста:
- Порівняйте базові, вихідні та цільові файли
- Визначте "шматки" у файлі вихідного та цільового файлів:
- Шматки, які не відповідають базі
- Шматки, які відповідають базі
- Потім складіть об'єднаний результат, що складається з:
- Шматки, які відповідають один одному у всіх 3-х файлах
- Шматки, які не відповідають базі ні в джерелі, ні в цілі, але не в обох
- Шматки, які не відповідають базі, але відповідають одна одній (тобто вони були змінені однаково як у вихідному, так і в цільовому)
- Заповнювачі місця, які конфліктують, вирішуються користувачем.
Зауважте, що "шматки" на цій ілюстрації суто символічні. Кожен може представляти рядки у файлі, або вузли в ієрархії, або навіть файли в каталозі. Все залежить від того, на що здатний конкретний інструмент злиття.
Ви можете запитати, яку перевагу пропонує тристороннє злиття над двостороннім злиттям. Насправді, немає такого поняття, як двостороннє злиття, лише інструменти, які відрізняють два файли і дозволяють "злитися", вибираючи шматки з одного чи іншого файлу.
Лише тристороння злиття дає вам змогу знати, чи є шматочок - це зміна походження та чи змінюється конфлікт чи ні.
Я написав про це дуже докладний пост . В основному ви не можете відстежувати видалення / додавання двостороннім, дуже, дуже непродуктивним.
Тристоронній злиття, коли два набори змін до одного базового файлу об'єднуються під час їх застосування, на відміну від застосування одного, а потім об'єднання результату з іншим.
Наприклад, наявність двох змін, коли додається рядок в одному місці, може бути інтерпретована як два доповнення, а не зміна одного рядка.
Наприклад
Файл a був змінений двома людьми, один додав лося, один додав мишу.
#File a
dog
cat
#diff b, a
dog
+++ mouse
cat
#diff c, a
dog
+++ moose
cat
Тепер, якщо ми об'єднаємо набори змін під час їх застосування, ми отримаємо (3-х напрямне злиття)
#diff b and c, a
dog
+++ mouse
+++ moose
cat
Але якщо ми застосуємо b, то подивіться на зміну від b до c це буде виглядати так, що ми просто змінюємо 'u' на 'o' (двостороннє злиття)
#diff b, c
dog
--- mouse
+++ moose
cat