What does "@@ -1 +1 @@" mean in Git's diff output?

GitDiff

Git Problem Overview


I've been collecting data from the information returned from

git diff <commitId>..<commitId>

and I ran into @@ -1 +1 @@

I can't figure out what that's telling me. I've searched a bit on Google but to no avail.

Git Solutions


Solution 1 - Git

Simple example analysis

The format is basically the same the diff -u unified diff.

For instance:

diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$')

Here we removed lines 2, 3, 14 and 15. Output:

@@ -1,6 +1,4 @@
 01
-02
-03
 04
 05
 06
@@ -11,6 +9,4 @@
 11
 12
 13
-14
-15
 16

@@ -1,6 +1,4 @@ means:

  • -1,6 means that this piece of the first file starts at line 1 and shows a total of 6 lines. Therefore it shows lines 1 to 6.

    1
    2
    3
    4
    5
    6
    

    - means "old", as we usually invoke it as diff -u old new.

  • +1,4 means that this piece of the second file starts at line 1 and shows a total of 4 lines. Therefore it shows lines 1 to 4.

    + means "new".

    We only have 4 lines instead of 6 because 2 lines were removed! The new hunk is just:

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ for the second hunk is analogous:

  • on the old file, we have 6 lines, starting at line 11 of the old file:

    11
    12
    13
    14
    15
    16
    
  • on the new file, we have 4 lines, starting at line 9 of the new file:

    11
    12
    13
    16
    

    Note that line 11 is the 9th line of the new file because we have already removed 2 lines on the previous hunk: 2 and 3.

Hunk header

Depending on your git version and configuration, you can also get a code line next to the @@ line, e.g. the func1() { in:

@@ -4,7 +4,6 @@ func1() {

This can also be obtained with the -p flag of plain diff.

Example: old file:

func1() {
    1;
    2;
    3;
    4;
    5;
    6;
    7;
    8;
    9;
}

If we remove line 6, the diff shows:

@@ -4,7 +4,6 @@ func1() {
     3;
     4;
     5;
-    6;
     7;
     8;
     9;

Note that this is not the correct line for func1: it skipped lines 1 and 2.

This awesome feature often tells exactly to which function or class each hunk belongs, which is very useful to interpret the diff.

How the algorithm to choose the header works exactly is discussed at: https://stackoverflow.com/questions/28111035/where-does-the-excerpt-in-the-git-diff-hunk-header-come-from

Solution 2 - Git

It's a unified diff hunk identifier. This is documented by GNU Diffutils.

> The unified output format starts with a two-line header, which looks like this: > >

> --- from-file from-file-modification-time
> +++ to-file to-file-modification-time
> 
> > The time stamp looks like 2002-02-21 23:30:39.942229878 -0800 to indicate the date, time with fractional seconds, and time zone. The fractional seconds are omitted on hosts that do not support fractional time stamps. > > You can change the header's content with the --label=label option; see See Alternate Names. > > Next come one or more hunks of differences; each hunk shows one area where the files differ. Unified format hunks look like this: > >
> @@ from-file-line-numbers to-file-line-numbers @@
>  line-from-either-file
>  line-from-either-file...
> 
> > If a hunk contains just one line, only its start line number appears. Otherwise its line numbers look like start,count. An empty hunk is considered to start at the line that follows the hunk. > > If a hunk and its context contain two or more lines, its line numbers look like start,count. Otherwise only its end line number appears. An empty hunk is considered to end at the line that precedes the hunk. > > The lines common to both files begin with a space character. The lines that actually differ between the two files have one of the following indicator characters in the left print column: > > * +
> A line was added here to the first file.
> * -
> A line was removed here from the first file.

Solution 3 - Git

It's the current hunk range information stating on which line numbers this diff hunk starts and ends.

Read http://en.wikipedia.org/wiki/Diff#Unified_format for an in-depth explanation.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSSEMemberView Question on Stackoverflow
Solution 1 - GitCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 2 - GitTodd A. JacobsView Answer on Stackoverflow
Solution 3 - GitYuval AdamView Answer on Stackoverflow