2015-01-25 3 views
1

Поскольку изменения могут иметь несколько родителей (слияния) и несколько детей, не может ли «самый последний общий предок» быть двусмысленным?Может ли недавний общий предок в git быть двусмысленным?

Например:

A---B--C--D                                    
\ \ /
    \ E/
    \// 
    F-G 

Самый последний общий предок для E и D может быть B или F.

Я попытался тиражирование это мерзавец, и я думаю, что он дал B в качестве общего предка. Есть ли здесь обоснование, чтобы выбрать B над F? Возможно, прибегая к отметкам времени? Или это просто первый общий предок, обнаруженный алгоритмом, который будет произвольной деталью реализации?

ответ

4

Это не только возможно, это упоминается в documentation for git merge-base:

мерзавца слияние база находит лучший общий предок (ов) между двумя фиксациями для использования в трехсторонний слиянии. Один общий предок лучше, чем другой общий предок, если последний является предком первого. Общим предком, который не имеет лучшего общего предка, является лучшим обычным предком, i.e. Базой слияния. Обратите внимание, что для пары коммитов может быть больше одной базы слияния.

[курсив мой, я думаю, что подчеркнутое предложение должно включать слово «лучший», на самом деле], а также:

... Ни один лучше, чем другие (оба лучше основания слияния). Если параметр --all не указан, он не указывается, какой из них выводится.

(что означает, как вы предположили, это деталь реализации).