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'显示staging为空,'git fsck'报告没有错误,'git diff --cached'报告没有。
我找到了一个解决方法:新鲜克隆目标分支,编辑出不能从commit1.patch应用的两个黑客,然后执行:
git apply -3 commit1.patch
git apply -3 commit2.patch
......没有任何错误
如何解决“不匹配索引”错误commit2.patch输出,除了先从commit1.patch手动删除两个帅哥?
您的问题的答案在the git apply
documentation,但在几个部分,我添加了粗体(选项已经是粗体):
-3, - 3way 当补丁不能干净地应用时,如果补丁记录了应该应用的blob的身份,则回退到三向合并,并且我们在本地可以使用这些blob,可能会将冲突标记留在工作树中的文件中供用户解决。此选项意味着
--index
选项,并且与--reject
和--cached
选项不兼容。
从这里你必须备份一下:
- 指数 当
--check
生效或应用补丁时(默认情况下,当禁用它的任何选项都没有生效时),请确保补丁适用于当前索引文件记录的内容。如果要在工作树中修补的文件不是最新的,则会将其标记为错误。此标志还会导致更新索引文件。
因此,通过使用-3
,您启用了--index
,如果文件的工作树副本与文件的索引副本不匹配,则--index
显式调用错误。
之前,在第3步中,您手动运行git apply --reject
,没有-3
或--index
。在创建.rej
文件时,这不会失败,但会使索引和工作树副本保持不同。
如果使用-3
没有任何意义,只需在两种情况下都将其保留,以便在不更新文件的索引副本的情况下应用,并且不会限制文件的工作树副本以匹配文件的索引副本无论是。