Как я возвращаю свои конфликты слияния мерзавца после слияния неправильно?

<? версия xml = "1.0" кодирование = "UTF-8"? > < code> Плоские файлы легче считать </code> </xml>

18
задан bdimcheff 4 November 2009 в 22:14
поделиться

3 ответа

Сначала проверьте, есть ли у вас конфликтующее состояние в индексе ( перед сбросом на 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

должен работать (я это проверил).

12
ответ дан 30 November 2019 в 09:06
поделиться

Вы можете сделать это с помощью 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
6
ответ дан 30 November 2019 в 09:06
поделиться

Вы можете использовать:

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

Обратите внимание, что я не так много тестировал. Если вы обнаружите какие-либо проблемы или у вас есть другие улучшения , здесь является "сутью", которую можно разветвлять.

0
ответ дан 30 November 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: