Что означает "@ @ -1 +1 @ @ " в выводе git diff?



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



git diff <commitId>..<commitId>


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



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

682   3  

3 ответов:

это унифицированный идентификатор diff hunk. Это документирована ПО GNU Diffutils.

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

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

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

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

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

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

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

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

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

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

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

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

например:

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 строки были удалены! Новый ломоть просто:

    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 строки на предыдущем куске: 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?

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

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

Comments

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