TL; DR: вы хотите драйвер слияния , который вы объявляете для определенных файлов в .gitattributes
.(Сам драйвер настраивается в .git/config
. См. документацию по gitattributes .)
Вы не можете настроить то, как Git решает , что некоторый файл должен быть объединен.Алгоритм принятия решения слишком прост для этого, поскольку он состоит из:
Определите три файла в базовом коммите слияния и двух сторонах (левой и правой, или нашей и их).
То есть предположим, что в базе слияния есть файл с именем path/to/abc.png
, а на двух сторонах также есть файлы с именем path/to/abc.png
.Git предполагает, что все три имени представляют один и тот же базовый файл.
Если, скажем, правая (--theirs
) сторона не имеет path/to/abc.png
,но имеет different/path/to/xyz.png
и , что файл кажется вновь созданным (не существует в базе слияния) и содержимое xyz.png
Git может достаточно идентифицировать их xyz.png
с abc.png
базы, но теперь правая сторона имеет изменение имени , а также потенциальный контент.разница.Это - переименование файла - это изменение high level .
Аналогично, если одна сторона полностью удаляет файл , это также изменение высокого уровня.(Если обе стороны полностью удаляют файл, то здесь нет никаких проблем: результатом слияния является просто «удалить файл».) Решение о том, что одна или обе стороны удалили файл, возникает из-за отсутствия несопоставленного файла (такой как этот недавно созданный xyz.png
), который выглядит достаточно похожим.
Теперь, когда мы / Git определили эти три файла как "одинаковые", требуется нетривиальное слияниеесли выполняется одно из следующих условий:
И левая, и правая стороны изменили содержимое на другое.Таким образом, хэши большого двоичного объекта в левой и правой сторонних коммитах для файла отличаются и , оба отличаются от хэша большого базового коммита.Обратите внимание, что это еще не означает, что существует конфликт ! Это просто означает, что требуется объединение.
Или, по крайней мере, одна сторона изменила содержимое, и другая сторона внесла изменения high level , такие как переименование или удаление файла.Это автоматически конфликт высокого уровня .
Если конфликт, обнаруженный в этой точке, является конфликтом высокого уровня , Git остановится и получит помощь.Тем не менее, он может сначала запустить драйвер слияния для трех входных файлов, если это необходимо.
Отложив любой конфликт высокого уровня или требование слияния в сторону,Git теперь решает, вызывать ли драйвер слияния низкого уровня для трех входных файлов.Это происходит, если (и только если):
- на самом деле существует три файла (ни один из трех не пропущен или не удален), а
- хэши больших двоичных объектов для всех трех различаются.
Низкоуровневый драйвер слияния - это драйвер, настроенный вами в файле .gitattributes
.Если вы не настроили один через .gitattributes
, это либо встроенный драйвер слияния текстовых файлов, либо встроенный драйвер слияния двоичных файлов.
Встроенный драйвер слияния текстовых файлов пытается объединить измененияиспользуя обычный метод diff-and-stick-merge-конфликта-markers-in.Если возникает конфликт, который не удается разрешить низкоуровневому драйверу текстового слияния, Git остановится и получит помощь.
Встроенный драйвер слияния двоичных файлов просто объявляет сбой.Git остановится и получит помощь.
Если вы предоставите свой собственный драйвер слияния, вы несете ответственность за получение правильного результата слияния и / или указание Git прекратить иполучить помощь.Поэтому, если у вас есть драйвер слияния, который знает, как объединять файлы .png
, вы можете установить его как драйвер слияния низкого уровня для *.png
.