Когда я объединяю ветку 1 и ветку 2 со стратегией, установленной как -Xours
, конфликты не обрабатываются стратегией для мягких ссылок. Не удается объединить программные ссылки.
Есть какие-нибудь подсказки, как справиться с этим сценарием?
git checkout branch2
git merge -Xours branch1 -m "syncing branch1"
-Xours - это вариант стратегии, а не вариант слияния.
Я имею в виду, что "-Xours" должен изменить стратегию, как в
git merge -s recursive -Xours mybranch
тогда как `` наш '' будет самой стратегией, заданной в качестве опции для команды слияния:
git merge -s ours mybranch
Однако будьте осторожны, так как эти два процесса разные. Последний просто проигнорирует ЛЮБЫЕ изменения в ветке mybranch, а не только в случае конфликта.
Все изменения содержимого символических ссылок рассматриваются как конфликты «высокого уровня», без использования кода слияния «низкого уровня».
Как RomainVALERI ответил, -X ours
(или --strategy-option=ours
) передается в стратегию слияния, которая в вашем случае является -s recursive
по умолчанию. Но как для рекурсивного слияния, так и для разрешающего слияния вариант стратегии (расширенный) «наш» применяется только к конфликты внутри (обычных) файлов.
Помните, что git merge
работает:
HEAD
, и другого коммита, который вы называете;git diff --find-renames
: один из базы слияния в HEAD
, а другой из базы слияния в другой коммит;(Применение комбинированных изменений к базе слияния дает результат слияния.)
Два git diff
могут обнаруживать изменения более высокого уровня (древовидного уровня). Например, возможно, из базы слияния в HEAD
вы модифицировали Readme.txt
, но они удаленныйReadme.txt
. Git не может их комбинировать, а -X ours
не одобряет ваши изменения перед своими: Git в любом случае просто объявляет конфликт слияния. Аналогично, изменение файла с "обычного файла" на "символическую ссылку" не обрабатывается -X ours
.
В вашем конкретном примере «файл» (на самом деле, blob-content) не изменил режимы, он только изменил контент: раньше это была символическая ссылка, указывающая на какой-то путь А, а теперь она указывает на какой-то другой путь B на на вашей стороне, и какой-то третий путь C на их стороне. Git мог разрешит эту проблему, взяв вашу на -X ours
, но это просто не так. Git заставляет вас разрешать этот конфликт вручную, так же как он заставляет вас вручную разрешать измененный / удаленный конфликт. Никакой вариант -X
не поможет.
Редактировать: это было объявлено ошибкой и исправлено в Git 2.17. Начиная с Git 2.17, -X ours
или -X theirs
выбирают нашу или их символическую ссылку. Следовательно, мог стал делает, если ваш Git 2.17 или новее.