2013-11-08 5 views
0

У меня есть теоретический вопрос о возможном слиянии VCS. Я знаю, что многие VCS используют 3 слияния версий, которые являются обычным предком, «моя» и «ваша» ревизия. Я знаю, как они работают.Теория VCS - слияние: рекурсивное слияние реверсирования или 3 слияние версий?

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

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

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

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

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

Как было сказано ранее, А общий предок так что родитель В и В».

Мы хотим объединить G и G»в ветви 1. Распространенный способ, что Git и Mercurial использование является diff3:

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

Это вычислит слияние путем вычисления только 3 версии, которая является O (1).

Альтернативный алгоритм я подумал о О (п):

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

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

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

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

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

  1. слияние В и В '

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

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

  4. слить результат с помощью D

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

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

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

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

Могут ли мои конфликты не «настоящие» конфликты? (Что традиция способ не вызывает)

ответ

0

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

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

Так что только B' - G 'необходимо объединить с веткой1. И это трехстороннее слияние.

BTW. третий компонент трехстороннего слияния не является «общим предком», а «базой». Обычный предок может быть базовым, но не всегда.

+0

Я имел в виду слияние G 'в G в ветке 1, было смущено между словами «и» и «в», а также между «общим предком» и «базой». Вы все еще не ответили на мой вопрос. – Tal

+0

Вы не можете объединить G 'в G. G неизменяемым и не могут быть изменены вообще (по крайней мере, с помощью команды merge). Вы можете объединить G 'в ветвь 1, а результатом слияния будет новый узел (ревизия) - H' –

+0

(продолжение) H будет содержать логические изменения A, B, C, D, E, F, G, G ' Я не могу ответить на последние 3 вопроса, потому что, похоже, не понимаю вашу идею. Но если предположим, что мое понимание верное, то: No Да Да –

Смежные вопросы