从git补丁中删除行而不会破坏

时间:2016-05-25 09:05:31

标签: git diff git-diff

我有一个庞大而复杂的git diff。它有大约1200个案例,它删除了一行包含字符串" fubar" (带引号,如果重要的话)。我想要做的是应用补丁,但不要删除这些行。

我尝试从补丁文件中删除以下表单的每一行。问题是然后行号是错误的,因此补丁已损坏。如果没有编辑行号,我想知道是否有一个理智的解决问题。

我删除了什么:

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

2 个答案:

答案 0 :(得分:3)

如果您希望修补程序不删除行,则必须用行空格替换行开头的-。在你的补丁中,你有一条未经修改的行,可以保留上下文。

替换:

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

  (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

告诉我们:

  • 我们标记为test.txt的版本中的差异问题文件a,以及我们标记为test.txt的版本中的同一文件b;
  • 版本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中的6行,从第2行开始;
  • +2,8表示它在版本b中代表8行,从第2行开始。

确实,我们添加了两行Line 4.5Line 4.6,我们可以从+行看到:

+Line 4.5
+Line 4.6

注意为上下文显示的其他未修改行如何以空格标记为上下文行。

如果您想修改补丁以不添加Line 4.6,则必须删除相应的+行。但是你还必须纠正大块中的行数,因为你只添加了一行,所以你得到了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中的8行,从第10行开始;
  • +12,6表示它代表版本b中的6行,从第12行开始。

它从第12行开始,因为前一个大块添加了两行。通常,您必须将12调整为11,因为您现在只在前一个大块中添加一行,但实际上您不需要,因为上下文行有助于识别实际行被修改。

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

@@ -10,8 +12,7 @@ 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

Line 22更改为Line 22 the 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

答案 1 :(得分:0)

基本上,您必须复制整行,然后“删除”第一个字符(通过用替换行开头的空格-)和«添加»第二个有变化(意味着用替换+)。在diff中,第一列是关于行状态的指示符(添加,删除或未更改)。

“第xxx行的损坏补丁”可能意味着空格丢失,或者您“逐字地”删除了一行,而不是将其标记为删除(使用减号-