Что означает "@@-1 +1 @@" в формате Git diff output?

Я собираю данные из информации, возвращенной из

git diff <commitId>..<commitId>

и я столкнулся с @@ -1 +1 @@

Я не могу понять, что это говорит мне. Я искал немного в Google, но безрезультатно.

Ответ 1

Это унифицированный идентификатор командной строки. Это задокументировано GNU Diffutils.

Единый формат вывода начинается с двухстрочного заголовка, который выглядит следующим образом:

--- from-file from-file-modification-time
+++ to-file to-file-modification-time

Временная метка выглядит как 2002-02-21 23:30:39.942229878 -0800, чтобы указать дату, время с дробными секундами и часовой пояс. Дробные секунды опущены на хостах, которые не поддерживают дробные метки времени.

Вы можете изменить содержимое заголовка с помощью опции --label=label; см. раздел Альтернативные имена.

Далее следуют один или несколько разностей различий; каждый кусок показывает одну область, где файлы отличаются. Унифицированные форматы файлов выглядят следующим образом:

@@ from-file-line-numbers to-file-line-numbers @@
 line-from-either-file
 line-from-either-file...

Если кусок содержит только одну строку, появляется только номер его начальной строки. В противном случае номера строк выглядят как start,count. Считается, что пустой кусок начинается с строки, следующей за куском.

Если ханк и его контекст содержат две или более строк, номера строк выглядят как start,count. В противном случае появляется только номер его конечной линии. Предполагается, что пустой кусок заканчивается на линии, которая предшествует лоскуту.

Линии, общие для обоих файлов, начинаются с символа пробела. Строки, которые фактически отличаются между двумя файлами, имеют один из следующих индикаторных символов в левой колонке печати:

  • +
    В первый файл добавлена ​​строка.
  • -
    Линия была удалена здесь из первого файла.

Ответ 2

Простой пример анализа

Формат в основном тот же, что и унифицированный diff diff -u.

Например:

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

Здесь мы удалили строки 2, 3, 14 и 15. Выход:

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

@@ -1,6 +1,4 @@ означает:

  • -1,6: эта часть соответствует строке 1-6 первого файла:

    01
    02
    03
    04
    05
    06
    

    - означает "старый", поскольку мы обычно вызываем его как diff -u old new.

  • +1,4 говорит, что этот фрагмент соответствует строкам с 1 по 4 второго файла.

    + означает "новый".

    У нас есть только 4 строки вместо 6, потому что были удалены 2 строки! Новый hunk:

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ для второго столбца аналогичен:

  • в старом файле, у нас есть 6 строк, начиная с строки 11 старого файла:

    11
    12
    13
    14
    15
    16
    
  • в новом файле, у нас есть 4 строки, начиная с строки 9 нового файла:

    11
    12
    13
    16
    

    Обратите внимание, что строка 11 является 9-й строкой нового файла, потому что мы уже удалили 2 строки в предыдущем hunk: 2 и 3.

Заголовок заголовка

В зависимости от версии и конфигурации git вы также можете получить строку кода рядом с строкой @@, например. func1() { в:

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

Это также можно получить с помощью флага -p plain diff.

Пример: старый файл:

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

Если мы удалим строку 6, diff показывает:

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

Обратите внимание, что это не правильная строка для func1: она пропустила строки 1 и 2.

Эта удивительная функция часто точно определяет, к какой функции или классу принадлежит каждый кусок, что очень полезно для интерпретации diff.

Как алгоритм выбора заголовка работает точно, обсуждается в: Откуда взялась выдержка в заголовке заголовка git diff?

Ответ 3

Это текущая информация диапазона скоростей, указывающая, на каких строках номера этого разного куска начинаются и заканчиваются.

Прочтите http://en.wikipedia.org/wiki/Diff#Unified_format для подробного объяснения.