Что означает мета-линия "@ @ ... @ @ " со знаками at в svn diff или git diff?



когда я использую svn diff или git diff он показывает такие строки:



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


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

632   3  

3 ответов:

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

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

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

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

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

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

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

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

формат в основном тот же самый diff -u unified diff.

например:

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 hunk?

Они описывают линии, на которые влияет diff hunk. В вашем случае это означает, что кусок влияет на 5 строк, начиная с строки 1, в результате чего замена начинается с строки 1, которая составляет 9 строк.

обратите внимание, что это формат, используемый унифицированным форматом diff. "Классический" формат diff использует другую модель (но кто использует классический diff в наши дни?).

Comments

    Ничего не найдено.