Git 补丁 - 补丁不适用

Posted

技术标签:

【中文标题】Git 补丁 - 补丁不适用【英文标题】:Git patch - patch does not apply 【发布时间】:2015-05-21 18:26:03 【问题描述】:

我正在尝试将更改拆分为多个提交,但在手动编辑大块时遇到了问题。

原版:

@@ -116,8 +116,8 @@
        context
        context
-           remove 1
-           remove 2
-           remove 3
+           add 1
+           add 2
+           add 3
        context
        context
        context

我只想暂存发生在“删除 1”和“删除 2”的更改。换句话说,我需要从提交中排除“删除 3”。

我试过这个:

@@ -116,4 +116,4 @@
            context
            context
-           remove 1
-           remove 2
+           add 1
+           add 2

但它一直输出补丁不适用。我只删除了最后的上下文行和“删除 3”和“添加 3”行。我编辑了大块范围并减去了 4 个排除行(3 个是上下文,1 个是更改,1 个被删除,1 个被添加)

我使用了 2 种不同的编辑器,“nano”和“sublime text”,它们的结果相同。我确保没有没有被注释掉的空行。

我做错了什么?

【问题讨论】:

为什么原来的补丁是@@ -116,8 +116,8 @@,而改版的却是@@ -116,4 +116,4 @@ 因为我删除了 4 行,其中 3 个是最后 3 个上下文行,还有一个是我不想包含的修改行。 好的,如果您只删除remove 3/add 3(无需额外编辑)并更改信息@@ -116,7 +116,7 @@,那么补丁是否适用? 不,也不应该。因为这样我完全删除了这条线,甚至是上下文之一。我可以找到解决方法(例如删除添加的行并将删除的行更改为上下文),但我需要了解为什么会发生这种情况。 【参考方案1】:

我做错了什么?

嗯,你正在手动编辑一个补丁文件,这似乎是一件奇怪的事情......

据我所知,git 需要补丁中的尾随上下文。例如,如果我从一个看起来像这样的文件开始:

the
quick
brown
fox
jumped
over
the
lazy
dog

我有一个这样的补丁:

diff --git a/file1 b/file1
index 4a3cebe..30f5937 100644
--- a/file1
+++ b/file1
@@ -1,9 +1,9 @@
 the
 quick
 brown
-fox
-jumped
-over
+ostrich
+shouted
+at
 the
 lazy
 dog

这毫无问题地适用:

$ git apply mypatch

如果我删除该补丁中的尾随上下文(并更新该行 数字),给我这个:

diff --git a/file1 b/file1
index 4a3cebe..30f5937 100644
--- a/file1
+++ b/file1
@@ -1,6 +1,6 @@
 the
 quick
 brown
-fox
-jumped
-over
+ostrich
+shouted
+at

那么git会拒绝应用补丁:

$ git apply diff
error: patch failed: file1:1
error: file1: patch does not apply

如果我添加一行尾随上下文,它就会起作用:

diff --git a/file1 b/file1
index 4a3cebe..30f5937 100644
--- a/file1
+++ b/file1
@@ -1,7 +1,7 @@
 the
 quick
 brown
-fox
-jumped
-over
+ostrich
+shouted
+at
 the

【讨论】:

我不是手动编辑补丁,而是交互式地暂存文件中的内容。我想必须有一个尾随的上下文行。【参考方案2】:

当 git 应用补丁时,它会同时查看前导和尾随上下文行。当 hunk 中没有前导上下文行时,hunk 必须应用在前映像的开头(更改之前的文件版本)。同样,没有尾随上下文意味着大块被锚定在末尾。

由于您已经删除了尾随的上下文行(并且不应该在末尾锚定大块),因此补丁将不适用。

【讨论】:

以上是关于Git 补丁 - 补丁不适用的主要内容,如果未能解决你的问题,请参考以下文章

从 git add -p 编辑大块时修复“补丁不适用”

从邮件列表应用 git 补丁

Git 打补丁流程

Git:如何为合并创建补丁?

git二进制补丁支持

git am:补丁格式检测失败