Конфликты «Добавить / добавить» являются частью группы конфликтов, для которых я еще не нашел действительно хорошего названия, но мы могли бы назвать их конфликты высокого уровня или конфликты деревьев .К ним относятся переименование / удаление и переименование / переименование .
Чтобы понять, что это значит, помните, что git merge
работает:
- поиск базы слияния (совместно используемой в обеих ветвях) коммит;
- сравнение базы слияния с каждым наконечником: два
git diff
s как бы.
Вывод каждой из двух команд git diff
говорит о том, что некоторые файлы были изменены, а некоторые файлы были созданы, удалены или переименованы.
Эти два сравнения имеютразличные ярлыки («наши» и «их», «локальные» и «удаленные» и т. д.), но большинство людей могут лучше их осмыслить, если к ним прикреплено имя человека, поэтому предположим, что изменения «базовый-наш»сделанные Алисой, а изменения base-vs-их сделаны Бобом.
Предположим, что Алиса и Боб оба начали с файла с именем READ.ME
.Алиса должна была переименовать его README.txt
при изменении, а Боб просто поменял его на месте.Чтобы объединить изменения Алисы и Боба, Git примет оба изменения, и переименуют файл с READ.ME
на README.txt
.Это неконфликтующее переименование: Git может сказать по каждому из двух git diff
s, которые он запускал, что Алиса переименовала файл при его изменении, и Боб оставил имя файла в одиночку при его изменении.
внутренние изменения в этом файле, чье имя изменилось на стороне Алисы (но не на имени Боба), могут конфликтовать или не конфликтовать.Если они делают конфликт, -X ours
сообщает Git, чьи изменения предпочитать: Алиса или Боб.Эти типы конфликтов низкоуровневые конфликты: в пределах одного файла, как определено после сканирования изменений «дерева» более высокого уровня (файлы, которые были созданы, переименованы или удалены).
К сожалениюу Git нет аргумента, чтобы сказать ему, чьи изменения, если таковые имеются, отдать предпочтение в случае high level или конфликтов на уровне дерева.Например, если Алиса и Боб переименовывают файл, но Алиса переименовывает его README.txt
, а Боб переименовывает его README.rst
, Git не знает, что делать.Аргумент -X
передается внутрифайловому коду слияния low level ;он не используется высокоуровневым кодом слияния файлов, созданных, или переименованных, или удаленных.
Следовательно:
Почему -Xours
не просто занимает всефайл из "нашей" ветки в этом случае, как это происходит с другими конфликтами?
Это просто не то, как определяется флаг -X
.Это применимо только к конфликтам «низкого уровня».
Есть ли способ настроить git merge
, чтобы в случае добавить / добавить конфликты, делает взять файл из "нашей" ветки вместо прерывания слияния?
Нет.Однако обратите внимание, что это не прерывание слияния: оно просто останавливает само слияние с конфликтами, чтобы получить помощь от кого-то или чего-то более умного, чем Git.Это должна быть ваша автоматизация, которая решит не помогать Git и прервать слияние.