代码之家  ›  专栏  ›  技术社区  ›  N08

理解Git Diff

  •  0
  • N08  · 技术社区  · 7 年前

    我的报告中有一个文件“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
    

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

    这里发生了什么?


    我在Windows7上运行Git。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Richard    7 年前

    在第1行,三行已被删除

    不,第1行和第2行尚未更改。diff显示一些上下文,在更改前后显示几行,以便于理解。

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

        2
  •  0
  •   tmaj    7 年前

    您已经更改了第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

        3
  •  0
  •   Amadan    7 年前

    Unix将一行定义为“以行结束符结尾的字符串”。因此,几乎所有基于Unix的编辑器都有这样的行:

    1\n
    2\n
    3\n
    

    在哪里? \n 表示lf字符,表示行尾。如果您在这里添加第四行,它实际上只是一个新行。

    Windows不共享此定义,许多基于Windows的编辑器考虑CR+LF组合(如下所示 \r\n )作为线条 分离器 ,不是线条 终结者 . AS git 注意到“文件末尾没有换行符”,您的文件是

    1\r\n
    2\r\n
    3
    

    当你添加另一行时,你

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

    所以从 吉特 以Unix为中心的观点,您通过附加 \rn 对它。

    现在去误会一下 diff 输出格式:默认为, 微分 正在为您提供“统一”格式,并在更改周围提供一些上下文。这些变化只是 + - 前缀:删除了原来的第3行,插入了新的第3行和第4行。符号 @@ -1,3 +1,4 @@ 下面的代码片段描述了旧文件的第1-3行和新文件的第1-4行。通常,统一的diff输出默认也会在每次更改前后为您提供两行上下文,以帮助人类准确理解更改的内容。( -U2 )如果不需要上下文,可以使用 -U0 .