Автоматическое разрешение конфликтов добавления и добавления - PullRequest
0 голосов
/ 25 октября 2018

Мы используем

git merge --no-ff -Xignore-all-space -Xours masterBranch

для автоматического обновления ветви интеграции из некоторого masterBranch в полностью автоматизированном конвейере сборки.Это автоматически разрешает конфликты слияния в существующих файлах путем извлечения блока из ветви интеграции (целевой ветви).

Однако это все равно приводит к конфликтам слияния в случае, если файл был добавлен в обе ветви (* 1006).*), и они не разрешаются автоматически, и объединение останавливается, ожидая ручного разрешения конфликтов.

  • Почему -Xours не просто берет весь файл из "нашей" ветви в этомслучай, как это происходит с другими конфликтами?
  • Есть ли способ настроить git merge, чтобы в случае конфликтов add / add он действительно принимал файл из "нашей" ветки вместо остановки слияния?

(это git 2.15.0)

1 Ответ

0 голосов
/ 25 октября 2018

Конфликты «Добавить / добавить» являются частью группы конфликтов, для которых я еще не нашел действительно хорошего названия, но мы могли бы назвать их конфликты высокого уровня или конфликты деревьев .К ним относятся переименование / удаление и переименование / переименование .

Чтобы понять, что это значит, помните, что 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 и прервать слияние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...