Ответ 1
Это может быть достигнуто с помощью git-merge-file
, хотя его API довольно низкоуровневый.
Чтобы иметь простую в использовании команду, вы можете использовать следующий bash script (для импорта в .bashrc
, или вы также можете установить его с помощью npm install -g git-resolve-conflict
):
git-resolve-conflict() {
STRATEGY="$1"
FILE_PATH="$2"
if [ -z "$FILE_PATH" ] || [ -z "$STRATEGY" ]; then
echo "Usage: git-resolve-conflict <strategy> <file>"
echo ""
echo "Example: git-resolve-conflict --ours package.json"
echo "Example: git-resolve-conflict --union package.json"
echo "Example: git-resolve-conflict --theirs package.json"
return
fi
git show :1:"$FILE_PATH" > ./tmp.common
git show :2:"$FILE_PATH" > ./tmp.ours
git show :3:"$FILE_PATH" > ./tmp.theirs
git merge-file "$STRATEGY" -p ./tmp.ours ./tmp.common ./tmp.theirs > "$FILE_PATH"
git add "$FILE_PATH"
rm ./tmp.common
rm ./tmp.ours
rm ./tmp.theirs
}
(Примечание. Я продолжаю обновлять script в своем репозитории GitHub, проверяю репо на последние улучшения: https://github.com/jakub-g/git-resolve-conflict/blob/base/lib/git-resolve-conflict.sh)
В конкретном примере, как описано в вопросе, использование будет следующим:
git-resolve-conflict --ours package.json
Пошаговое исследование:
https://github.com/jakub-g/git-resolve-conflict
Bonus:
Если в подпапках имеется несколько файлов package.json
и вы хотите разрешить слияние для всех из них, находящихся в конфликтующем состоянии:
for ITEM in $(git diff --name-only --diff-filter=U | grep package.json$); do git-resolve-conflict --ours $ITEM; done