Простой примерный анализ
Формат в основном совпадает с унифицированным diff 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 первого file: 1
2
3
4
5
6
-
означает «старый», как мы обычно вызываем его как diff -u old new
. +1,4
говорит, что этот фрагмент соответствует строкам с 1 по 4 второго файла. +
означает «новый». У нас есть только 4 строки вместо 6, потому что были удалены 2 строки! Новый hunk: 1
4
5
6
@@ -11,6 +9,4 @@
для второго столбца аналогичен:
11
12
13
14
15
16
11
12
13
16
Обратите внимание, что строка 11
является 9-й строка нового файла, потому что мы уже удалили 2 строки в предыдущем hunk: 2 и 3. Hunk header
В зависимости от вашей версии и конфигурации 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.
Как алгоритм выбора заголовка работает точно обсуждается at: Откуда берутся отрывки в заголовке git diff hunk?