合并错误后如何恢复我的git合并冲突?

时间:2009-11-04 22:14:22

标签: git merge

我正在尝试合并两个有很多变化的分支,其中几个分支有合并冲突。我使用git mergetool合并了文件,但后来我意识到我错误地合并了其中几个。我基本上想要回到那些几个文件的冲突状态,所以我可以重新运行mergetool并纠正我的错误。我不想丢弃我的整个合并,因为大部分都是正确的。

我已经尝试重置到我的脑海,然后做git checkout -m other_branch -- my_file无济于事。我最终重置为HEAD,将文件从另一个分支中取出,只对文件执行git add --patch,只进行我想要的操作。但必须有更好的方法......

4 个答案:

答案 0 :(得分:12)

首先,通过

检查索引中的状态是否存在冲突(重置为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,例如Charles Bailey said,或使用临时文件。如果你有,那么

$ git checkout -m my_file

应该有效(我已经检查过了)。

答案 1 :(得分:6)

可以<{1}}使用git update-index--cacheinfo选项执行此操作,以删除给定索引中的--index-info条目分别使用基本版本,本地版本和远程版本来归档和填充012条目,但这将是繁琐的。

将各种版本提取到临时文件可能会更容易,并手动运行合并工具,将答案写入正确的文件并添加成功合并的结果。

e.g。

3

手动运行mergetool,写入git show $(git merge-base HEAD MERGE_HEAD):file >base-file git show HEAD:file >local-file git show MERGE_HEAD:file >remote-file

file

答案 2 :(得分:0)

您可以使用:

git checkout [--ours|--theirs|--merge] <paths>

检查在合并到或来自的分支上找到的路径,或重新创建冲突的合并。

git-checkout联机帮助页有关于此问题的更多内容。

正如Charles Bailey所指出的,当合并文件已经添加到索引中时,这不起作用。我玩了一下,这是一个应该完成这项工作的脚本:

#!/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

请注意,我没有测试过这么多。如果您发现任何问题或有其他改进,here是一个可分叉的“要点”。

答案 3 :(得分:0)

如果你不小心接受对冲突解决提示说“是”而不保存mergetool的更改,我认为你可以隐藏暂存的更改并重做合并。

git stash
git merge <other branch>