Что означает мета-строка «@@… @@» с символами at в svn diff или git diff? - PullRequest
58 голосов
/ 19 декабря 2011

Когда я использую svn diff или git diff, отображаются строки вроде:

@@ -1,5 +1,9 @@

Что они означают?

Ответы [ 3 ]

58 голосов
/ 19 декабря 2011

Они называются (c) заголовками блоков и содержат информацию о диапазоне.

Они окружены двойными знаками @@. Они имеют формат:

@@ -l,s +l,s @@

, где l - номер начальной строки, а s - количество строк, к которым применяется блок изменений (c) для каждого соответствующего файла. - обозначает исходный файл, а + обозначает новый (измененный) файл. Обратите внимание, что он показывает не только затронутые строки, но и строки контекста.

-1,5 находится в исходном файле (указан -). Это показывает, что первая строка - это начало и 5 строк, затронутых / контекстных

+1,9 находится в новом (модифицированном) файле (обозначен +), и снова первая строка - это начало и 9 затронутых / контекстных строк.

Подробнее здесь: http://en.wikipedia.org/wiki/Diff#Unified_format

17 голосов

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

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

Например:

diff -u <(seq 16) <(seq 16 | grep -Ev '^(2|3|14|15)$')

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

@@ -1,6 +1,4 @@
 1
-2
-3
 4
 5
 6
@@ -11,6 +9,4 @@
 11
 12
 13
-14
-15
 16

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

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

    1
    2
    3
    4
    5
    6
    

    - означает «старый», так как мы обычно называем его diff -u old new.

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

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

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

    1
    4
    5
    6
    

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

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

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

    11
    12
    13
    16
    

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

Заголовок куска

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

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

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

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

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

Если мы удалим строку 6, разница покажет:

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

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

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

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

5 голосов
/ 19 декабря 2011

Они описывают линии, на которые воздействует блок сравнения. В вашем случае это означает, что блок влияет на 5 строк, начиная со строки 1, что приводит к замене, начинающейся с строки 1 длиной 9 строк.

Обратите внимание, что это формат, используемый унифицированным форматом diff. В «классическом» формате diff используется другая модель (но кто сейчас использует классический diff?).

...