Що означає "@@ -1 +1 @@" у різному випуску Git?


104

Я збирав дані з поверненої інформації

git diff <commitId>..<commitId>

і я наткнувся на @@ -1 +1 @@

Я не можу зрозуміти, що це мені говорить. Я трохи шукав в Google, але безрезультатно.


Чи можете ви описати, який файл призводить до такого заголовка?
kworr

@kworr - це щось нерозумне питання, будь-яке розходження в уніфікованому форматі має заголовки діапазону.
Юваль Адам

@YuvalAdam: насправді у різному уніфікованому форматі є більше полів, які слід заповнити як [- +] <position>, <lines>, і тут у нас не відображаються зміни, але ці зміни торкаються першого рядка файлу.
kworr

Відповіді:


69

Це уніфікований ідентифікатор розрізнення. Це задокументовано GNU Diffutils.

Уніфікований вихідний формат починається з дворядкового заголовка, який виглядає приблизно так:

--- від-файлу від -файла-модифікація-часу 
+++ до-файла-файла-модифікації-час

Марка часу схожа 2002-02-21 23:30:39.942229878 -0800на позначення дати, часу з дробовими секундами та часового поясу. Дробові секунди опускаються на хостах, які не підтримують дробові позначки часу.

Ви можете змінити вміст заголовка за допомогою --label=labelпараметра; див. Див. альтернативні імена .

Далі йдуть один або декілька розбіжностей; кожна команда показує одну область, де файли відрізняються. Уніфікований формат виглядає приблизно так:

@@ від-файл-рядок-номери до-файл-рядок-номери @@
  рядок-або-файл- 
 рядок-від-будь-якого-файла ...

Якщо команда містить лише один рядок, відображається лише номер її початкового рядка. Інакше номери рядків виглядають так . Порожній лук вважається починається на лінії, що йде за ножем.start,count

Якщо лук та його контекст містять два чи більше рядків, його номери рядків мають вигляд . Інакше відображається лише номер його кінцевої лінії Порожній лук вважається закінченням на лінії, що передує лусці.start,count

Рядки, спільні для обох файлів, починаються з пробілу. Рядки, які насправді відрізняються між двома файлами, містять один із наступних символьних символів у лівій колонці друку:

  • +
    Тут було додано рядок до першого файлу.
  • -
    З першого файлу тут видалено рядок.

69

Простий приклад аналізу

Формат в основному такий же, як 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 рядків. Тому він показує рядки 1 - 6.

    1
    2
    3
    4
    5
    6
    

    -означає "старий", як ми його зазвичай називаємо diff -u old new.

  • +1,4означає, що цей фрагмент другого файлу починається з рядка 1 і показує загалом 4 рядки. Тому він показує рядки 1 - 4.

    + означає "новий".

    У нас є лише 4 рядки замість 6, оскільки 2 рядки видалено! Новий фрагмент:

    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 рядки з попереднього елемента: 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 hunk?


Так, я б читав @@ -1,6 +1,4 @@як "Починаючи з 1-го рядка, кількість старих рядків була 6, але кількість нових рядків - 4"
Хмара


6

Це поточна інформація про діапазон деталей, яка вказує, на яких номерах рядків починається і закінчується цей різний фрагмент.

Прочитайте http://en.wikipedia.org/wiki/Diff#Unified_format для поглибленого пояснення.


Дякую. Виручили. Якщо немає кома та s, вони знаходяться за замовчуванням до 1.
SSEMember
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.