Редактировать: Как отмечает Маркус в комментарии, git mergetool
может быть вызвано для одного файла.С правильным аргументом merge.tool
или -t
и настройкой mergetool.<tool>.cmd
вы можете заставить его вызывать крошечный скрипт, который:
- помещает версию файла
--ours
в рабочее деревоcopy, затем - использует это плюс базовую и
--theirs
версии файла в качестве аргументов для git merge-file --ours
или git merge-file --theirs
.
Код выхода этого "редактора"можно доверять (см. merge.<tool>.trustExitCode
), что позволяет git mergetool
запускать git add
для вас.Таким образом, вы, вероятно, можете несколько сократить сценарий.
(я никогда этого не делаю, и фактически я никогда не использую git mergetool
. Если бы я был , используя git mergetool
, я бы хотелоцените результаты самостоятельно, как Маркус предлагает в своем ответе .)
Для этого не существует команды в одну строку, хотя, вероятно, должно быть и Вы можете написать его самостоятельно.
Команда, которая выполнит эту работу: git merge-file
.Однако прежде чем вы сможете запустить git merge-file
, вам понадобятся три входных файла, которые git merge
видел.
Эти три файла существуют; проблема заключается визвлекая их.Команда git mergetool
решает эту проблему, 1 , но, к сожалению, она решает ее не слишком полезным для вас способом.Вы хотите решить это для одного файла , но git mergetool
повторяет его для всех необработанных файлов (и затем запускает на них выбранный вами инструмент слияния, обычно какой-то трехсторонний редактор)по одному).
git mergetool
использует git checkout-index
с опцией --stage
.Три версии некоторого файла file.ext
все находятся в index , как этап 1 (базовая версия слияния), этап 2 (--ours
версия) и этап 3 (--theirs
версия).При использовании git mergetool
скрипт извлекает три в <em>file.ext</em>.BASE
, <em>file.ext</em>.LOCAL
и <em>file.ext</em>.REMOTE
соответственно.Вы должны делать более или менее одно и то же, хотя вы можете выбрать разные имена.См. сценарий git mergetool
(и, если хотите, его основной вспомогательный сценарий , хотя все, что вам здесь нужно, это основной - я связал непосредственно со строками, которые извлекаютфайлы, в то время как функция, которая реализует это в другом месте основного файла) для кода.
Как только у вас есть три входных файла, просто запустите на них git merge-file
с правильными аргументами.См. документацию git merge-file
, чтобы увидеть, что это за аргументы.Проверьте результат и, если хотите, поместите его на место вместо существующего файла рабочего дерева с разметкой конфликтов и используйте git add
, чтобы исключить три файла с более высоким номером и записать объединенный файл в нулевой этап,где он готов к фиксации.
Разрешите оставшиеся неразрешенные файлы, как вам нравится.
1 Ну, то есть, он решает это в большинстве случаев.Для конфликтов переименования / переименования git mergetool
просто запутывается: здесь немного не хватает информации в индексе.