<? версия xml = "1.0" кодирование = "UTF-8"? > < code> Плоские файлы легче считать </code> </xml>
Сначала проверьте, есть ли у вас конфликтующее состояние в индексе ( перед сбросом на HEAD ) через
$ git ls-files --stage --abbrev my_file
. Вы должны получить что-то вроде следующего:
100644 257cc56 1 my_file
100644 b7d6715 2 my_file
100644 5716ca5 3 my_file
Если вы этого не понимаете, вам придется использовать git update-index
, как Чарльз Бейли сказал , или использовать временные файлы. Если он у вас есть, то
$ git checkout -m my_file
должен работать (я это проверил).
Вы можете сделать это с помощью git update-index
, используя либо - cacheinfo
, либо - index Параметры -info
для удаления записи 0
в индексе для данного файла и заполнения 1
, 2
и 3
записи с базовой, локальной и удаленной версиями соответственно, но это будет неудобно.
Вероятно, будет проще извлечь различные версии во временные файлы и вручную запустить инструмент слияния, записав ответ в правильный файл и добавление результата успешного слияния.
например
git show $(git merge-base HEAD MERGE_HEAD):file >base-file
git show HEAD:file >local-file
git show MERGE_HEAD:file >remote-file
Запустить mergetool вручную, записав в файл
.
git add file
Вы можете использовать:
git checkout [--ours|--theirs|--merge] <paths>
для проверки путей, найденных в ветке, в которую сливается или из нее, или для воссоздания конфликтующего слияния.
На странице руководства git-checkout есть немного подробнее по этому вопросу.
Как указал Чарльз Бейли, это не работает, если объединенный файл уже был добавлен в индекс. Я немного поигрался и вот скрипт, который должен сработать:
#!/bin/bash
#
# Distributed under the GNU General Public License, version 2.0.
#
# git-goat:
#
# Restore a merge conflict, after it has already been resolved.
# Lifted from contrib/completion/git-completion.bash
__gitdir ()
{
if [ -z "${1-}" ]; then
if [ -n "${__git_dir-}" ]; then
echo "$__git_dir"
elif [ -d .git ]; then
echo .git
else
git rev-parse --git-dir 2>/dev/null
fi
elif [ -d "$1/.git" ]; then
echo "$1/.git"
else
echo "$1"
fi
}
into=$(git describe --all HEAD)
from=$(cat $(__gitdir)/MERGE_HEAD)
base=$(git merge-base $into $from)
case "$1" in --ours|--theirs|--merge) whose=$1; shift; esac
[ -z "$1" ] && echo "fatal: at least one file has to be specified" && exit
for file in "$@"
do
(
echo -e "0 0000000000000000000000000000000000000000\t$file"
git ls-tree $base $file | sed -e "s/\t/ 1\t/"
git ls-tree $into $file | sed -e "s/\t/ 2\t/"
git ls-tree $from $file | sed -e "s/\t/ 3\t/"
) | git update-index --index-info
git checkout ${whose:-"--merge"} $file
done
Обратите внимание, что я не так много тестировал. Если вы обнаружите какие-либо проблемы или у вас есть другие улучшения , здесь является "сутью", которую можно разветвлять.