Как указать "нашу" стратегию git merge с .gitattributes для удаленных файлов? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть 2 ветки в моем проекте: A (master) и B. В ветке B некоторые файлы в master были удалены. Я хочу избежать конфликтов слияния, когда есть изменения в мастер-файлах, которые были удалены в B.

Я добавил файлы в .gitattributes, например,

README.adoc merge=ours

Для моего слиянияу меня есть драйвер

[merge "ours"]
name = Always keep mine during merge
driver = true

Однако у меня все еще возникают конфликты, и я не могу понять, что я делаю неправильно.

git merge master
CONFLICT (modify/delete): README.adoc deleted in HEAD and modified in master. Version master of README.adoc left in tree.

Что я делаю неправильно? Я запустил git check-attr, и он показывает

README.adoc: merge: ours

Я также попробовал GIT_TRACE=2, но он не дает никакой полезной информации;он только говорит мне, откуда он получает двоичные файлы.

1 Ответ

0 голосов
/ 09 ноября 2019
Конфликт

A modify/delete является конфликтом high level . Драйверы слияния, определенные в .gitattributes, используются только для разрешения конфликтов low level : драйвер слияния используется только тогда, когда файл (a) существует во всех трех версиях (базовая и обе подсказки ветвления) и (б) отличается во всех трех версиях. Здесь файл существует в двух версиях - базовая и одна ветвь - и отличается в этих двух версиях, но третья версия просто полностью удаляется, и драйвер слияния никогда не вызывается.

Для recursiveСтратегии, resolve и subtree, конфликты высокого уровня всегда приводят к конфликту слияния и слиянию в середине процесса. Конфликты высокого уровня просто никогда не возникают в стратегии ours (-s ours, очень отличающейся от расширенной опции -X ours), поскольку она смотрит только на текущее дерево. Конфликты высокого уровня в octopus являются (я думаю) фатальными: слияние осьминога полностью прервано. 2

Я хочу избежать конфликтов слияния при изменении в A вфайлы, которые были удалены в B.

Для этого необходимо написать стратегию слияния . Это сложно. 1 См. Мой ответ на git "тривиальную" стратегию слияния, которая непосредственно совершает конфликты слияния .


1 Основным доказательством «жесткого», которое я имею, является тот факт, что Git поставляется с этими пятью стратегиями - resolve, recursive, ours, octopus и subtree - и, несмотря на более чем десятилетнее развитие, Gitдо сих пор есть только эти пять стратегий.

2 На самом деле я никогда не делаю слияния осьминога, поэтому мой опыт здесь ограничен.

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