Cosa significa "@@ -1 +1 @@" nell'output diff di Git?


104

Ho raccolto dati dalle informazioni restituite da

git diff <commitId>..<commitId>

e mi sono imbattuto @@ -1 +1 @@

Non riesco a capire cosa mi stia dicendo. Ho cercato un po 'su Google ma inutilmente.


Puoi descrivere quale file risulta in tale intestazione?
kworr

@kworr è una domanda sciocca, qualsiasi diff in formato unificato ha intestazioni di intervallo.
Yuval Adam,

@YuvalAdam: in realtà il formato unificato diff ha più campi che dovrebbero essere riempiti come [- +] <position>, <lines> e qui non abbiamo modifiche visualizzate ma queste modifiche toccano la prima riga del file.
kworr

Risposte:


69

È un identificatore di hunk diff unificato. Questo è documentato da GNU Diffutils.

Il formato di output unificato inizia con un'intestazione di due righe, simile a questa:

--- from-file from-file-modification-time 
+++ to-file to-file-modification-time

Il timestamp sembra 2002-02-21 23:30:39.942229878 -0800indicare la data, l'ora con frazioni di secondo e il fuso orario. I secondi frazionari vengono omessi sugli host che non supportano i timestamp frazionari.

Puoi modificare il contenuto dell'intestazione con l' --label=labelopzione; vedere Vedere Nomi alternativi .

Poi vengono uno o più pezzi di differenze; ogni pezzo mostra un'area in cui i file differiscono. Gli hunk di formato unificato hanno questo aspetto:

@@ from-file-line-numbers to-file-line-numbers @@
  line-from-any-file 
 line-from-any-file ...

Se un pezzo contiene solo una riga, viene visualizzato solo il numero della riga iniziale. Altrimenti i suoi numeri di riga sembrano . Si considera che un pezzo vuoto inizi sulla linea che segue il pezzo.start,count

Se un pezzo e il suo contesto contengono due o più righe, i suoi numeri di riga saranno simili . In caso contrario, viene visualizzato solo il numero della riga finale. Si considera che un pezzo vuoto termini sulla linea che precede il pezzo.start,count

Le righe comuni a entrambi i file iniziano con uno spazio. Le righe che differiscono effettivamente tra i due file hanno uno dei seguenti caratteri indicatori nella colonna di stampa a sinistra:

  • +
    Una riga è stata aggiunta qui al primo file.
  • -
    Una riga è stata rimossa qui dal primo file.

69

Semplice analisi di esempio

Il formato è fondamentalmente lo stesso del diff -udiff unificato.

Per esempio:

diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$')

Qui abbiamo rimosso le righe 2, 3, 14 e 15. Risultato:

@@ -1,6 +1,4 @@
 01
-02
-03
 04
 05
 06
@@ -11,6 +9,4 @@
 11
 12
 13
-14
-15
 16

@@ -1,6 +1,4 @@ si intende:

  • -1,6significa che questo pezzo del primo file inizia alla riga 1 e mostra un totale di 6 righe. Quindi mostra le righe da 1 a 6.

    1
    2
    3
    4
    5
    6
    

    -significa "vecchio", come di solito lo chiamiamo diff -u old new.

  • +1,4significa che questo pezzo del secondo file inizia alla riga 1 e mostra un totale di 4 righe. Quindi mostra le righe da 1 a 4.

    + significa "nuovo".

    Abbiamo solo 4 righe invece di 6 perché 2 righe sono state rimosse! Il nuovo pezzo è solo:

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ per il secondo pezzo è analogo:

  • sul vecchio file, abbiamo 6 righe, a partire dalla riga 11 del vecchio file:

    11
    12
    13
    14
    15
    16
    
  • sul nuovo file, abbiamo 4 righe, a partire dalla riga 9 del nuovo file:

    11
    12
    13
    16
    

    Nota che la riga 11è la nona riga del nuovo file perché abbiamo già rimosso 2 righe sul blocco precedente: 2 e 3.

Intestazione del pezzo

A seconda della versione e della configurazione di git, puoi anche ottenere una riga di codice accanto alla @@riga, ad esempio func1() {in:

@@ -4,7 +4,6 @@ func1() {

Questo può essere ottenuto anche con la -pbandiera della pianura diff.

Esempio: vecchio file:

func1() {
    1;
    2;
    3;
    4;
    5;
    6;
    7;
    8;
    9;
}

Se rimuoviamo la linea 6, il diff mostra:

@@ -4,7 +4,6 @@ func1() {
     3;
     4;
     5;
-    6;
     7;
     8;
     9;

Nota che questa non è la riga corretta per func1: ha saltato le righe 1e 2.

Questa fantastica funzionalità spesso dice esattamente a quale funzione o classe appartiene ogni pezzo, il che è molto utile per interpretare il diff.

Come funziona esattamente l'algoritmo per scegliere l'intestazione è discusso in: Da dove viene l'estratto nell'intestazione dell'hunk diff di git?


Ah, quindi leggerei @@ -1,6 +1,4 @@come "A partire dalla riga 1, il conteggio delle vecchie righe era 6 ma il conteggio delle nuove righe è 4"
Cloud


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.