0

我有一个包含单行更改的补丁文件。运行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

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

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

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

4

1 回答 1

1

目标文件在更改的行上方确实有几行额外的行。这是因为 git 无法确定单行更改的位置而失败吗?

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

使用-3or--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是您的提交和他们的提交共享的基本版本。该补丁更改了文件的基本版本。你的提交有同一个文件的不同版本,但是通过比较vs ——即补丁中的内容——<em>同时比较vs ,Git 可能能够自己弄清楚如何应用毕竟补丁。CDCDBCB

这里的诀窍是了解 Git 从 commit 中的文件的位置B。答案index在补丁中,如果有的话。这index为 Git 提供了查找将要提交的文件副本所需的信息B——当然,前提是您实际上在存储库中拥有该文件的副本。

于 2020-06-17T21:04:51.107 回答