理解git diff

时间:2018-09-05 06:44:12

标签: git git-diff

我的仓库中有一个文件“ file.txt”,其中包含三行:

1
2
3

此文件已提交。但是,如果我现在在文件中添加第四行,则如下所示:

1
2
3
4

当我输入“ git diff file.txt”时,会显示以下输出:

diff --git a/file.txt b/file.txt
index 5f5fbe7..b178657 100644
--- a/file.txt
+++ b/file.txt
@@ -1,3 +1,4 @@
 1
 2
-3
\ No newline at end of file
+3
+4
\ No newline at end of file

换句话说,根据git diff(@@ -1,3 +1,4 @@),在第一行删除了三行,并添加了四行。这对我来说没有意义,因为我所做的只是添加第四行-所以我希望输出(-0,0 +4,1

这是怎么回事?


我正在Windows 7上运行git。

3 个答案:

答案 0 :(得分:1)

  

第1行的三行已被删除

否,第1行和第2行没有更改。 Diff会显示一些上下文,以及更改前后的几行内容,以便于理解。

差异显示第3行已删除,第3行和第4行已添加。第3行发生了变化,因为它之前没有行尾,但是之后没有(因此diff显示“第1行的三行已被删除”)。

答案 1 :(得分:0)

您已更改了第3行,并添加了第4行。

第3行的更改是新行。

git diff --unified=0可能更有意义(这仅显示更改的行)。

diff --git a/a.txt b/a.txt index 5f5fbe7..b178657 100644 --- a/a.txt +++ b/a.txt @@ -3 +3,2 @@ -3 \ No newline at end of file +3 +4 \ No newline at end of file

最好以彩色显示:

enter image description here

答案 2 :(得分:0)

UNIX将行定义为“以行终止符结尾的字符串”。因此,几乎所有基于UNIX的编辑器都具有以下代码行:

1\n
2\n
3\n

其中\n代表LF字符,表示一行的结尾。如果您要在此处添加第四行,则实际上只是一个新行。

Windows不共享此定义,许多基于Windows的编辑器将CR + LF组合(以下记为\r\n)视为行分隔符,而不是行 terminator < / em>。正如git用“ \文件末尾没有换行符”指出的那样,您的文件是

1\r\n
2\r\n
3

添加另一行后,您得到了

1\r\n
2\r\n
3\r\n
4

因此,从git的以UNIX为中心的角度来看,您确实通过在行3上附加了\r\n来修改了行3。

由于对diff输出格式存在误解:默认情况下,diff为您提供了“统一”格式,并带有有关更改的上下文。所做的更改只是以+-为前缀的行:原始的第3行已被删除,新的第3行和第4行被插入。符号@@ -1,3 +1,4 @@表示,下面的代码段描述了旧文件的1-3行和新文件的1-4行。通常,统一的diff输出默认会在每次更改前后为您提供两行上下文,以帮助人们准确了解更改的内容(-U2)。如果您不想使用上下文,则可以使用-U0将其关闭。