2015-06-11 4 views
0

я случайно есть файл (скажем ABC) в двух ветвей: мастер и образца.мерзавец автоматического слияния не работает, как ожидалось

дата фиксации для аЬс на образце старше аЬс на текущем мастер; другими словами abc последний на мастер.

Теперь, я побежал:

git checkout sample 
git merge master 

Автопоиск объединенное несколько файлов (включая аЬс).

Задача: Line # 42 в аЬс, кажется, сохраняется от ветви образца вместо получения замененного от мастера.

Почему это происходит? Я ожидал иначе. Пожалуйста помоги.

ответ

1

Того факт, что а новее на мастера чем на образце не означает, что он получает полностью заменен мастера версии в процессе слияния. Если образец «s версия аЬс имеет некоторые изменения, которые не присутствуют на мастера, даже если они старше последнего изменения в мастер, мерзавец будет пытаться сохранить их во время слияния.

+0

Является ли git merge не похожим на объединение двух версий файла с конфликты возникают, если есть перекрытие в линиях?Почему в моем случае не было конфликта слияния? Вместо этого автоматически слияние .... @ michael-ivko – 82Tuskers

+0

@ 82Tuskers: Если трехстороннее слияние git смогло слить его должным образом, почему возникает конфликт слияния? Просто будьте рады, что git смог объединить его без каких-либо проблем. И если ваша главная ветвь развивалась дальше, а «образец» - нет, ее еще проще для git с быстрым слиянием. – ckruczek

+4

@ 82Tuskers: merge не образует союзы * файлов *, а скорее применяет объединение * diffs * к версии слияния некоторых файлов (ов). База слияния определяется следующей историей фиксации, после которой git получает два diff: base-vs-HEAD (и HEAD = tip образца здесь) и base-vs-merge-version (master). Затем Git объединяет различия. Если base-vs-HEAD изменил строку 42, но base-vs-master не сделал этого, git сохранит изменение от HEAD (т. Е. Sample). Вы получаете конфликт только тогда, когда и образец, и мастер изменили строку 42 (против того, что было в базе) * и * два изменения * разные *. – torek

1

Важно помнить, что при слиянии Git не работает на уровне файла; скорее, он работает на линии . Если строка была изменена в sample, но не в master (или в master, но не в sample), это изменение будет в слиянии двух ветвей.

Чтобы понять, почему Git делает это, рассмотрим следующий сценарий:

  1. sample ответвляется от master
  2. Person X меняет линию 42 в АВС на sample
  3. Человек Y меняет линию 54 в АВС на master
  4. ветви сливаются

Если Git объединился так, как вы ожидали, изменения человека X были бы потеряны в этом случае. Проверяя поочередно, Git сохраняет как можно больше изменений. Обратите внимание, что если оба человека X и лицо Y изменили строку 42, слияние привело бы к конфликту, независимо от того, в каком порядке были внесены изменения.

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