当先前的应用跳过块时,“ git apply”给出错误“与索引不匹配”

时间:2019-02-16 04:12:33

标签: git git-apply

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输出?

1 个答案:

答案 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 或文件的索引副本。