我正在尝试合并两个有很多变化的分支,其中几个分支有合并冲突。我使用git mergetool
合并了文件,但后来我意识到我错误地合并了其中几个。我基本上想要回到那些几个文件的冲突状态,所以我可以重新运行mergetool并纠正我的错误。我不想丢弃我的整个合并,因为大部分都是正确的。
我已经尝试重置到我的脑海,然后做git checkout -m other_branch -- my_file
无济于事。我最终重置为HEAD,将文件从另一个分支中取出,只对文件执行git add --patch
,只进行我想要的操作。但必须有更好的方法......
答案 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
条目分别使用基本版本,本地版本和远程版本来归档和填充0
,1
和2
条目,但这将是繁琐的。
将各种版本提取到临时文件可能会更容易,并手动运行合并工具,将答案写入正确的文件并添加成功合并的结果。
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>