"git apply" 给出错误 "does not match index" 当之前的申请跳过 hunks

"git apply" gives error "does not match index" when a previous apply skips hunks

git 版本 2.19.0

我有两个文件提交 'myfile' 我正在从一个分支到另一个分支进行挑选。在最后一个补丁应用期间,我得到 "error: mydir/myfile: does not match index".

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 以跳过应用两个不适用的 hunks:

git apply --reject 1.patch

... 不记录错误并记录它按预期跳过的两个补丁块,并应用补丁的其余部分。

4) 我应用补丁 #2:

git apply -3 commit2.patch
error: mydir/myfile: does not match index

为什么错误 "does not match index"? 'git status' 显示暂存为空,'git fsck' 报告无错误,'git diff --cached' 无报告。

我找到了一个解决方法:重新克隆目标分支,编辑掉无法从 commit1.patch 应用的两个 hunks,然后执行:

git apply -3 commit1.patch
git apply -3 commit2.patch

… 没有错误

如何解决 "does not match index" 错误 commit2.patch 输出,而不是首先从 commit1.patch 中手动删除两个 hunk?

您的问题的答案在 the git apply documentation 中,但在几个部分中,我添加了粗体字(选项已经是粗体字):

-3, --3way
When the patch does not apply cleanly, fall back on 3-way merge if the patch records the identity of blobs it is supposed to apply to, and we have those blobs available locally, possibly leaving the conflict markers in the files in the working tree for the user to resolve. This option implies the --index option, and is incompatible with the --reject and the --cached options.

从这里你必须后退一点:

--index
When --check is in effect, or when applying the patch (which is the default when none of the options that disables it is in effect), make sure the patch is applicable to what the current index file records. If the file to be patched in the working tree is not up to date, it is flagged as an error. This flag also causes the index file to be updated.

因此,通过使用 -3,您打开了 --index,如果文件的工作树副本与文件的索引副本不匹配,--index 会明确调用错误文件。

之前,在第 3 步中,您手动 运行 git apply --reject 而没有 -3--index。创建 .rej 文件时 不会 失败,但是 确实 使索引和工作树副本不同。

如果使用 -3 没有意义,只需在这两种情况下都将其省略,这样您就可以在不更新文件的索引副本并且不限制文件的工作树副本的情况下进行应用文件 匹配 文件的索引副本。