Git merge разрешает конфликты в символических ссылках

Когда я объединяю ветку 1 и ветку 2 со стратегией, установленной как -Xours, конфликты не обрабатываются стратегией для мягких ссылок. Не удается объединить программные ссылки. Есть какие-нибудь подсказки, как справиться с этим сценарием?

шаги

git checkout branch2
git merge -Xours branch1 -m "syncing branch1"

1
320
2

Ответы:

-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 или новее.