Теория VCS - слияние: рекурсивное слияние ревизий или слияние 3 ревизий?

У меня есть теоретический вопрос о возможном слиянии VCS. Я знаю, что многие VCS используют слияние 3 ревизий, которое является общим предком, "моя" и "ваша" ревизия. Я знаю, как они работают.

Я думал о другой альтернативе, рекурсивном слиянии ревизий, не нашел этого в Google. "Вы нашли Америку!" ты можешь подумать. Я знаю, что Git использует рекурсивное слияние. Но причина, по которой Git использует рекурсивное слияние, заключается в слиянии

Я говорю о нормальном случае, без слияния.

Например, у нас есть общий предок, A и ветви 1 и 2.

branch 1: B,  C,  D,  E,  F,  G

branch 2: B', C', D', E', F', G'

Как сказано выше, A является общим предком, поэтому он является родителем B и B'.

Мы хотим объединить G и G'в ветку 1. Обычный способ использования Git и Mercurial - это diff3:

diff3(ancestor = A, mine = G, yours = G')

Это будет вычислять слияние, вычисляя только версию 3, то есть O(1).

Альтернативный алгоритм, о котором я думал, это O(n):

  1. Сначала объедините самые близкие ревизии с предком.

  2. объединить результат со следующей ближайшей ревизией из ветви 1

  3. объединить результат со следующей ближайшей ревизией из ветви 2 (если останется)

  4. Повторите (в цикле) шаг 2, если в ветви 1 остались какие-либо изменения.

В приведенном выше примере это выглядит так:

  1. объединить B и B '

  2. объединить результат с C

  3. объединить результат с C'

  4. объединить результат с D

  5. и так далее...

Вопрос, который я не смог решить, - есть ли какой-то случай, когда мой путь безопаснее и точнее (в случае слияния без перекрещивания), чем традиционное слияние с 3 ревизиями?

Может ли мой путь избежать конфликтов, которые вызывают традиционный путь?

Может ли мой путь создавать новые конфликты, которых не вызывает традиционный путь?

Разве мои конфликты не являются "настоящими" конфликтами? (что традиционным путем не вызывает)

1 ответ

Решение

Мы хотим объединить G и G 'в ветвь 1.

Почему мы хотим объединить G в branch1? G уже в филиале1. В лучшем случае мы ничего не даем от этого слияния, в худшем - конфликт. То же самое для всех других версий без

Поэтому только B' - G' необходимо объединить с branch 1. И это трехстороннее слияние.

КСТАТИ. Третий компонент трехстороннего слияния не "общий предок", а "базовый". Общий предок может быть базовым, но не всегда.

Другие вопросы по тегам