Я бы не советовал использовать -X ours
или -X theirs
(или их более длинные орфографические эквиваленты, --strategy-option ours
и т. П.) Здесь.
Конфликт, который видит Git - помните, Git работает построчно - в том, что в base merge commit Git видит:
const a = 1;
В одном из двух коммитов tip tip (назовем это левой стороной или ours
one) Git видит:
const a = 1;
const b = 1;
Это для Git выглядит так:
- в строке a = 1 (что соответствует) add
const b = 1;
Между тем, в другом коммите tip tip, theirs
или справа, Git видит:
const a = 2;
Для Git это выглядит так:
- в строке a = 1 удалить строку и вставить
const a = 2;
вместо
Обе инструкции "касаются" строки a=1
, поэтому Git объявляет конфликт.
Если вы скажете Git отдать предпочтение «нашему» / левой стороне, Git сохранит инструкцию add b = 1
line и выбросит delete a = 1
и вставить строку замены инструкция. Если вы скажете Git отдать предпочтение «их» / правой стороне, Git сохранит инструкцию, которая заменит a=1
на a=2
, но выбросит другую инструкцию.
В любом случае вы получите неправильное разрешение. Правильное разрешение - принять оба изменения , даже если они кажутся конфликтующими . У Git нет способа сделать это автоматически.
В этом случае мне нравится устанавливать merge.conflictStyle
на diff3
. Таким образом, когда Git оставляет беспорядочный конфликт слияния в моем рабочем дереве, файл выглядит так:
<<<<<<< HEAD
const int a = 1;
const int b = 1;
||||||| merged common ancestor
const int a = 1;
=======
const int a = 2;
>>>>>>> master
По умолчанию семь вертикальных полос и const int a = 1;
базовых линий отсутствуют (а иногда оставшиеся линии сжимаются вместе еще больше). Это очень трудно читать. При стиле diff3
базовые линии там : вы можете увидеть, с чего все начали, и принять собственное решение, принять ли оба изменения, только одно изменение или какую-то третью альтернативу, которая лучше, чем любая из них. .
(см. Также http://psung.blogspot.com/2011/02/reducing-merge-headaches-git-meets.html)