Может кто-нибудь объяснить это интересное поведение мерзкого слияния - PullRequest
4 голосов
/ 27 мая 2011

У меня две ветви,

A-C (master)
 \
  B-D (clean)

В A..C я добавил каталог с кучей файлов. В A..B я добавил точно такой же каталог и файлы, так что git diff C..B не показывает изменений в этом каталоге. В B..D я внес изменения в эти файлы. Я хочу объединить эти изменения в master. Я попробовал два разных подхода, один работал чисто, а другой безумно плохо:

git merge clean

Приведенная выше команда создает массу конфликтов, фактически конфликтов для каждого файла.

git merge clean^
git merge clean

Вышеописанное работает отлично, рекурсивно сливается, никаких конфликтов вообще нет.

Как и почему это происходит? Может ли мерзавец не взглянуть на историю и определить, что это был ранний раскол? Или это слишком обременительно для использования в качестве стратегии слияния?

1 Ответ

3 голосов
/ 27 мая 2011

В первом случае, git merge clean, Git не имеет общего предка для конфликтующих файлов, на которых основываются слияния, поэтому похоже, что вы пытаетесь объединить два дерева, которые оба создали одинаковые имена файлов, но с разнымисодержание.(У общего предка A нет конфликтующих файлов.)

Во втором случае, git merge clean^ && git merge clean, первое слияние снова не видит общих предков, но может тривиально разрешить его, потому чтофайлы одинаковы.Второе слияние может взять уже известную родословную и просто применить diff.

...