Что означают цифры в заголовке Git Diff?
Каждый раз, когда я запускаю git diff, для каждого отдельного изменения, которое я сделал, я получаю некоторый заголовок с числами, например:
@@ -169,14 +167,12 @@ function Browser(window, document, body, XHR, $log) {.....
Интересно, что означают четыре цифры? Я предполагаю, что -169 означает, что эта конкретная строка кода, которая следует, первоначально была в строке 169, но теперь находится в 167? А что означают 14 и 12?
Ответы
Ответ 1
Этот заголовок называется набор изменений или блок. Каждый блок начинается со строки, содержащей, заключенный в @@, строку или диапазон строк from,no-of-lines
в файле до (с -
) и после (с +
) изменений. После этого идут строки из файла. Строки, начинающиеся с -
, удаляются, добавляются строки, начинающиеся с +
. Каждая строка, измененная патчем, окружена тремя строками контекста до и после.
Дополнение выглядит так:
@@ -75,6 +103,8 @@
foo
bar
baz
+line1
+line2
more context
and more
and still context
Это означает, что в исходном файле перед строкой 78 (= 75 + 3 строки контекста) добавьте две строки. Это будут строки с 106 (= 103 + 3 контекста) через 107 после всех изменений.
Обратите внимание на разницу в числах from
(-75 и +103), это означает, что в этот файл были внесены другие изменения перед этим конкретным блоком, который добавил 28 (103–75) строк кода.
Удаление выглядит так:
@@ -75,7 +75,6 @@
foo
bar
baz
-line1
more context
and more
and still context
Это значит, удалить строку 78 (= 75 + 3 строки контекста) в исходном файле. Неизмененный контекст будет находиться в строках с 75 по 80 после всех изменений.
Обратите внимание, что числа from
в этом блоке равны (-75 и +75), это означает, что либо до этого блока не было никаких изменений, либо количество добавленных и удаленных строк в предыдущих изменениях было одинаковым.
Наконец, изменение выглядит следующим образом:
@@ -70,7 +70,7 @@
foo
bar
baz
-red
+blue
more context
and more
still context
Это означает, что перед всеми изменениями измените строку 73 (= 70 + 3 строки контекста) в файле, которая содержит красный на синий. Измененная строка также является строкой 73 (= 70 + 3 строки контекста) в файле после всех изменений.
Кредит принадлежит Маркусу Берто.
Ответ 2
Интересно, что означают четыре числа?
Давайте проанализируем простой пример
Формат в основном совпадает с унифицированным diff diff -u
.
Мы начинаем с цифр от 1 до 16 и удаляем 2, 3, 14 и 15:
diff -u <(seq 16) <(seq 16 | grep -Ev '^(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 по 6.
1
2
3
4
5
6
-
означает "старый", так как мы обычно называем его diff -u old new
.
+1,4
означает, что этот фрагмент второго файла начинается со строки 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.
Ответ 3
Резюме:
- Предположим, что
git diff
выведет [0-3] строки контекста [до/после] [первый/последний] изменения
@@- [original file number of first line displayed
], [context lines + removed lines
] + [ changed file number of first line displayed
], [context lines + added lines
] @@