2

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

4

1 回答 1

2

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

-3,--3way
当补丁不能干净地应用时,如果补丁记录了它应该应用到的 blob 的标识,并且我们在本地有这些 blob 可用,则可能会留下冲突标记工作树中的文件供用户解析。此选项隐含--index选项--reject,并且与和选项不兼容--cached

从这里你必须备份一点:

--index
何时--check生效,或应用补丁时(这是禁用它的选项均无效时的默认值),确保该补丁适用于当前索引文件记录的内容。如果工作树中要修补的文件不是最新的,则将其标记为错误。此标志还会导致索引文件被更新。

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

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

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

于 2019-02-16T06:54:25.193 回答