git版本2.19.0
我对文件'myfile'进行了两次提交,这是我从一个分支到另一个分支的选择。在上一个补丁应用期间,出现“错误:mydir / myfile:与索引不匹配”。
1)我生成了两个补丁文件commit1.patch(最旧)和commit2.patch(最新):
cd /target-branch
git --git-dir=/source-branch/myrepo/.git format-patch -k -1 <commit N's ID>
2)我应用了补丁1:
git apply -3 commit1.patch
error: patch failed: mydir/myfile:17
error: repository lacks the necessary blob to fall back on 3-way merge.
error: mydir/myfile: patch does not apply
...这按预期失败,因为补丁中的两个块修改了比提交#1更早的提交中添加的代码块。我不应用较早的提交,因为它是我不希望在目标分支中使用的修复程序。
3)我使用--reject而不是-3重新应用补丁1,以跳过应用两个不适用的块:
git apply --reject 1.patch
...不会记录任何错误,并记录它按预期跳过的两个补丁请求,并应用其余补丁。
4)我应用了补丁#2:
git apply -3 commit2.patch
error: mydir/myfile: does not match index
为什么错误“与索引不匹配”?为什么“ git status”显示暂存为空,“ git fsck”没有错误,“ git diff --cached”没有任何错误。
我找到了一种解决方法:重新克隆目标分支,编辑掉不能从commit1.patch应用的两个块,然后执行:
git apply -3 commit1.patch
git apply -3 commit2.patch
…可以正常工作
除了首先手动从commit1.patch中删除两个块以外,如何解决“不匹配索引”错误commit2.patch输出?
答案 0 :(得分:2)
您的问题的答案在the git apply
documentation中,但是在几个部分中,我添加了黑体字(选项已经用黑体字显示):
-3,--3way
如果补丁不能很好地贴上,请退回三路合并,如果 该补丁会记录应该应用于的Blob的身份, 我们在本地有这些blob,可能会离开 用户在工作树中的文件中使用冲突标记 解决。 此选项暗含--index
选项,它是 与--reject
和--cached
选项不兼容。
从这里开始,您必须备份一点:
-索引
--check
有效或应用补丁时(即 默认情况下,所有禁用它的选项均无效), 确保补丁适用于当前索引文件 记录。 如果要在工作树中修补的文件不符合要求 日期,将其标记为错误。此标记还会导致索引 文件进行更新。
因此,通过使用-3
,您打开了--index
,并且如果文件的工作树副本与文件的索引副本不匹配,--index
会显式调用错误。
之前,在第3步中,您手动运行了git apply --reject
,没有 -3
或--index
。创建.rej
文件时不会失败,但是 不会使索引和工作树副本不同。
如果没有必要使用-3
,则在两种情况下都将其省略,这样就可以在不更新文件索引副本的情况下应用,而不必将文件的工作树副本限制为 match 或文件的索引副本。