为什么 git 申请了却失败了?

Why does git apply and am fail?

我有一个补丁文件,其中包含一行更改。 运行 git am 失败并显示消息:

error: patch failed: Pages/Index.cshtml.cs:15
error: Pages/Index.cshtml.cs: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Applying: restrict index page to internal users
Patch failed at 0001 restrict index page to internal users
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

目标文件在更改的行上方确实有几行。这是因为 git 无法确定单行更改的位置而失败吗?如果是这样,是否意味着目标文件和源文件需要本质上相同?

运行 git apply 使用相同的补丁生成此消息:

error: patch failed: Pages/Index.cshtml.cs:15
error: Pages/Index.cshtml.cs: patch does not apply

我相信这基本上是相同的消息,只是友好(或者至少不那么冗长。)

我是在尝试一些补丁不适合的东西吗?即,将更改从一个存储库应用到另一个不具有文件内容等效性的存储库。

我确实找到了 this post,但是当使用相同的解决方案时,我得到的只是没有变化和一个简单的 .rej 文件输出。

The target file does have a couple of extra lines above the changed line. Is this failing because git cannot determine where the single line change?

是的,是这样的。 Git 不仅检查特定的更改(添加这个,删除那个),还检查发生更改的上下文。如果上下文不匹配,则补丁不适用。

使用 -3--3way 可以提供帮助:此选项背后的想法是,如果补丁是针对您 执行的文件版本 在你的 Git 存储库中,Git 可以提取文件的那个版本,将 那个 版本与 当前 版本,查看您的 文件副本中发生了什么变化,以及合并(如git merge 样式操作)您的更改以及他们的变化。如图所示,想象一下:

...--o--o--B--o--o--o--C   <-- your current commit and copy of the file
            \
             D   <-- the commit from which the patch was generated

提交 Bbase 版本,您的提交 C 和他们的提交 D 共享。该补丁更改了文件的 base 版本。您的提交 C 具有同一文件的 不同版本 ,但是通过比较 DB——即补丁中的内容——and 同时比较 CB,Git 也许能够自己弄清楚如何应用补丁。

这里的技巧是了解 Git 提交 B 的文件在哪里。答案在 index 行中,如果有的话,在补丁中。 index 为 Git 提供了查找提交 B 中的文件副本所需的信息——当然,前提是您确实在存储库中拥有该文件的副本.