为什么 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
提交 B
是 base 版本,您的提交 C
和他们的提交 D
共享。该补丁更改了文件的 base 版本。您的提交 C
具有同一文件的 不同版本 ,但是通过比较 D
与 B
——即补丁中的内容——and 同时比较 C
和 B
,Git 也许能够自己弄清楚如何应用补丁。
这里的技巧是了解 Git 提交 B
的文件在哪里。答案在 index
行中,如果有的话,在补丁中。 index
为 Git 提供了查找提交 B
中的文件副本所需的信息——当然,前提是您确实在存储库中拥有该文件的副本.
我有一个补丁文件,其中包含一行更改。 运行 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
提交 B
是 base 版本,您的提交 C
和他们的提交 D
共享。该补丁更改了文件的 base 版本。您的提交 C
具有同一文件的 不同版本 ,但是通过比较 D
与 B
——即补丁中的内容——and 同时比较 C
和 B
,Git 也许能够自己弄清楚如何应用补丁。
这里的技巧是了解 Git 提交 B
的文件在哪里。答案在 index
行中,如果有的话,在补丁中。 index
为 Git 提供了查找提交 B
中的文件副本所需的信息——当然,前提是您确实在存储库中拥有该文件的副本.