git 采用 theirs/ours 并成功合并代码

git take theirs/ours AND successfully merged code

假设在 feature Git 分支上基于 master Git 分支时发生冲突:

git init
echo -e "one\ntwo\nthree\nfour\nfive" > foo
git add foo
git commit -m a

echo -e "ONE\ntwo\nTHREE\nfour\nfive" > foo
git commit -a -m b

git checkout -b feature HEAD^
echo -e "One\ntwo\nthree\nfour\nFive" > foo
git commit -a -m c

git rebase master

冲突文件 foo 是:

<<<<<<< HEAD
ONE
=======
One
>>>>>>> c
two
THREE
four
Five

如何从命令行获取文件 foo_master 包含 成功合并(THREEFive),如果发生冲突,master 代码 (ONE):

ONE
two
THREE
four
Five

请注意,它不同于 git checkout --ours foo,后者不包含 来自 feature 的修改已成功应用 (Five):

ONE
two
THREE
four
five

我还想要包含以下内容的对应文件 foo_feature feature 代码以防发生冲突,但修改了 master 已成功应用 (ONE):

One
two
THREE
four
Five

然后我的目标是垂直 vimdiff 文件 foo_masterfoo_feature解决冲突

两次使用 git merge-file,一次使用 --ours,一次使用 --theirs。 (请注意,这些与 -s ours 不同,但更像 -X ours,但它们仅适用于一组三个输入文件。)

您将需要所有三个输入文件,但它们在冲突合并期间可用,因为所有三个都在索引中,处于阶段 1(基础)、2(我们的)和 3(他们的)。使用 git checkout-index --stage=all 一次提取所有三个。请注意,这意味着 --temp,因此您会打印三个文件名,其中包含三个输入文件的三个副本,从索引中复制到可用格式。

(这就是 git mergetool 获取文件的三个副本以提供给外部合并工具(例如 vimdiff)的方式。)