Я собираю данные из информации, возвращенной из
git diff <commitId>..<commitId>
и я столкнулся с @@ -1 +1 @@
Я не могу понять, что это говорит мне. Я искал немного в Google, но безрезультатно.
Я собираю данные из информации, возвращенной из
git diff <commitId>..<commitId>
и я столкнулся с @@ -1 +1 @@
Я не могу понять, что это говорит мне. Я искал немного в Google, но безрезультатно.
Это унифицированный идентификатор командной строки. Это задокументировано 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
. В противном случае появляется только номер его конечной линии. Предполагается, что пустой кусок заканчивается на линии, которая предшествует лоскуту.Линии, общие для обоих файлов, начинаются с символа пробела. Строки, которые фактически отличаются между двумя файлами, имеют один из следующих индикаторных символов в левой колонке печати:
- +
В первый файл добавлена строка.- -
Линия была удалена здесь из первого файла.
Простой пример анализа
Формат в основном тот же, что и унифицированный 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?
Это текущая информация диапазона скоростей, указывающая, на каких строках номера этого разного куска начинаются и заканчиваются.
Прочтите http://en.wikipedia.org/wiki/Diff#Unified_format для подробного объяснения.