Простой пример анализа
Формат в основном такой же, как и 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 первого файла:
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?