Что означают символы @ и цифры между ними в изменениях github? [Дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

56
задан Ciro Santilli 新疆改造中心 六四事件 法轮功 12 July 2015 в 12:06
поделиться

3 ответа

Они называются (c) заголовками заголовков и содержат информацию о диапазоне.

Они окружены двойными знаками @@. Они имеют формат:

@@ -l,s +l,s @@

, где l - номер стартовой строки, а s - количество строк, к которым применяется изменение (c) hunk для каждого соответствующего файла. - указывает исходный файл, а + указывает новый (измененный) файл. Обратите внимание, что он не только отображает затронутые строки, но и строки контекста.

-1,5 находится в исходном файле (обозначается -). Он показывает, что первая строка представляет собой начальную и 5 затронутые / контекстные строки

. +1,9 находится в новом (измененном) файле (обозначается +), а снова первая строка - это начало и 9 затронутых / контекстных линий.

Подробнее здесь: http://en.wikipedia.org/wiki/Diff#Unified_format

53
ответ дан Martin Geisler 18 August 2018 в 09:21
поделиться
  • 1
    Итак, числа относятся к контексту hunk +? то есть строки, напечатанные git, представляют собой строки (измененные) строки и 3 строки до и 3 строки после строк (измененных). Таким образом, диапазон строк от начала контекста до конца контекста, т. Е. От 3 строк до первой измененной строки до 3 строк после последней измененной строки? – Will 24 August 2017 в 16:11
  • 2

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

Формат в основном совпадает с унифицированным 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 @@ для второго столбца аналогичен:

  • в старом файле, у нас есть 6 строк, начиная с строки 11 старого файла:
    11
    12
    13
    14
    15
    16
    
  • в новом файле, у нас есть 4 строки, начиная с строки 9 нового файла:
    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?

15
ответ дан Community 18 August 2018 в 09:21
поделиться
  • 1
    Это, вероятно, лучшее объяснение diff hunk. – mahonya 4 September 2015 в 14:12
  • 2
    Ну, у меня есть @ @ -20,7 +20,8 @@ UserDefinedStitcher, и я подумал, что, возможно, это говорит мне, что мои изменения были в строке 20 или, точнее, на 20 строк от строки 6. (Строка 6 - это строка что говорит UserDefinedStitcher.) Но это приводит меня к строке 26, но мои изменения были на линии 23. Таким образом, казалось бы, что git вышел на 3 строки. Что происходит? – Will 24 August 2017 в 15:41
  • 3
    @ Пожалуйста, создайте минимальный воспроизводимый пример. – Ciro Santilli 新疆改造中心 六四事件 法轮功 24 August 2017 в 15:51
  • 4
    Ах, я вижу, что 20 - это номер АБСОЛЮТНОЙ линии с начала файла. И строка 20 - это строка в начале показанного контекста, и мое изменение в 3-х строках вниз в контексте, следовательно, строка 23. Фу! :) – Will 24 August 2017 в 15:55

Они описывают строки, затронутые diff hunk. В вашем случае это означает, что hunk влияет на 5 строк, начиная с строки 1, в результате чего начинается замена в строке 1, длина которой составляет 9 строк.

Обратите внимание, что это формат, используемый унифицированным форматом diff. В классическом формате diff используется другая модель (но кто использует классическую дифференциацию в эти дни?).

5
ответ дан fge 18 August 2018 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: