从git修补程序中删除行而不损坏

从git修补程序中删除行而不损坏,git,diff,git-diff,Git,Diff,Git Diff,我有一个大而复杂的git diff。它有大约1200个案例,其中删除了一行包含字符串“fubar”(如果有必要的话,加上引号)。我想做的是应用补丁,但不要删除这些线 我尝试从修补程序文件中删除以下表单的每一行。问题是行号错误,因此修补程序已损坏。除了编辑行号之外,我想知道是否有一个合理的方法来解决这个问题 我删除的内容: - (whatever here) "fubar" (whatever else here) 基本上,您必须复制完整的行,然后«删除»第一个字符(将行开头的空格替换为-),然

我有一个大而复杂的git diff。它有大约1200个案例,其中删除了一行包含字符串“fubar”(如果有必要的话,加上引号)。我想做的是应用补丁,但不要删除这些线

我尝试从修补程序文件中删除以下表单的每一行。问题是行号错误,因此修补程序已损坏。除了编辑行号之外,我想知道是否有一个合理的方法来解决这个问题

我删除的内容:

- (whatever here) "fubar" (whatever else here)

基本上,您必须复制完整的行,然后«删除»第一个字符(将行开头的空格
替换为
-
),然后«添加»第二个字符(意思是将
替换为
+
)。在差异中,第一列是关于行状态(添加、删除或未更改)的指示器


“第xxx行损坏的修补程序”可能意味着缺少一个空格,或者您删除了一行,而不是将其标记为已删除(使用减号
-

如果您希望修补程序不删除一行,则必须用空格替换该行开头的
-
。在你的补丁中,你有一个未修改的行,它会保留在那里作为上下文

替换:

- (whatever here) "fubar" (whatever else here)

(请注意,修改行中的文本仍然与原始文本对齐,这确认了
-
已被空格替换,而不仅仅是删除。)

要更好地理解修补程序,请查看以下示例:

diff --git a/test.txt b/test.txt
index 67179f2..9c17455 100644
--- a/test.txt
+++ b/test.txt
@@ -2,6 +2,8 @@ Line 1
 Line 2
 Line 3
 Line 4
+Line 4.5
+Line 4.6
 Line 5
 Line 6
 Line 7
@@ -10,8 +12,6 @@ Line 9
 Line 10
 Line 11
 Line 12
-Line 13
-Line 14
 Line 15
 Line 16
 Line 17
@@ -19,7 +19,7 @@ Line 18
 Line 19
 Line 20
 Line 21
-Line 22
+Line 22 the cops
 Line 23
 Line 24
 Line 25
第一行:

diff --git a/test.txt b/test.txt
index 67179f2..9c17455 100644
--- a/test.txt
+++ b/test.txt
告诉我们:

  • 在我们标记为
    a
    的版本中,差异涉及文件
    test.txt
    ,在我们标记为
    b
    的版本中,差异涉及相同的文件
    test.txt
  • 版本
    a
    中的文件存储在散列
    67179f2
    下,版本
    b
    中的文件存储在散列
    9c17455
    下(如果我没有弄错的话,这些不是提交散列,而是对象散列)
  • -
    在hunk行中表示版本
    a
    +
    表示版本
    b
然后我们有一个大块头:

@@ -2,6 +2,8 @@ Line 1
 Line 2
 Line 3
 Line 4
+Line 4.5
+Line 4.6
 Line 5
 Line 6
 Line 7
  • -2,6
    表示版本
    a
    中从第2行开始的6行
  • +2,8
    表示版本
    b
    中从第2行开始的8行
实际上,我们增加了两行,
第4.5行和
第4.6行,我们可以从
+
行中看到:

+Line 4.5
+Line 4.6
请注意,为上下文显示的其他未修改的行是如何以一个空格开始的,以便将它们标记为上下文行

如果要修改修补程序以不添加
第4.6行
,则必须删除相应的
+
行。但您还必须更正hunk中的行数,因为您只添加了一行,因此最终得到7行,而不是8行:

@@ -2,6 +2,7 @@ Line 1
 Line 2
 Line 3
 Line 4
+Line 4.5
 Line 5
 Line 6
 Line 7
在我们的第二个大块头中:

@@ -10,8 +12,6 @@ Line 9
 Line 10
 Line 11
 Line 12
-Line 13
-Line 14
 Line 15
 Line 16
 Line 17
  • -10,8
    表示版本
    a
    中从第10行开始的8行
  • +12,6
    表示版本
    b
    中从第12行开始的6行
它从第12行开始,因为前一个大块头加了两行。通常情况下,您必须将
12
调整为
11
,因为您现在只在前一行中添加一行,但实际上您不需要这样做,因为上下文行有助于识别修改的实际行

现在,如果您不想删除第14行,因为您只是迷信数字13,那么您必须将第14行保留在那里,但作为上下文行,因为它在应用补丁后仍然存在。因此,您将
-
更改为一个空格,并更正行数(结果是7行,而不是6行):

最后,最后一个大块头:

@@ -19,7 +19,7 @@ Line 18
 Line 19
 Line 20
 Line 21
-Line 22
+Line 22 the cops
 Line 23
 Line 24
 Line 25
通过删除旧行并添加修改后的行,它将
第22行
更改为
第22行cops
。它从之前和之后的第19行开始,因为之前的大块头删除了他们总共添加的相同数量的行,并且双向涉及7行,因为它添加了一行,删除了一行

您可以用不同的方式更改更改。更改修改行的内容:

@@ -19,7 +19,7 @@ Line 18
 Line 19
 Line 20
 Line 21
-Line 22
+Line 22 THE COPS
 Line 23
 Line 24
 Line 25
或添加一个额外的行:

@@ -19,7 +19,8 @@ Line 18
 Line 19
 Line 20
 Line 21
-Line 22
+Line 22
+    the cops
 Line 23
 Line 24
 Line 25
这可以简化,因为它不再修改第22行:

@@ -19,7 +19,8 @@ Line 18
 Line 19
 Line 20
 Line 21
 Line 22
+    the cops
 Line 23
 Line 24
 Line 25

你打什么命令<代码>git应用
?能否粘贴键入的完整命令(以及尝试应用的更完整的修补程序文件)?您是否熟悉
git add-p
commanddamned,太晚了,无法编辑-\uux-以及您的错误消息?第xxx行的修补程序已损坏请使用您要应用的完整修补程序(或至少指定的行和3-4之前/之后)和原始修补程序编辑您的问题,而无需进行修改
@@ -19,7 +19,8 @@ Line 18
 Line 19
 Line 20
 Line 21
-Line 22
+Line 22
+    the cops
 Line 23
 Line 24
 Line 25
@@ -19,7 +19,8 @@ Line 18
 Line 19
 Line 20
 Line 21
 Line 22
+    the cops
 Line 23
 Line 24
 Line 25