Co oznacza „@@ -1 +1 @@” w danych wyjściowych diff Git?


104

Zbieram dane z informacji zwróconych z

git diff <commitId>..<commitId>

i wpadłem @@ -1 +1 @@

Nie wiem, co mi to mówi. Szukałem trochę w Google, ale bezskutecznie.


Czy możesz opisać, jaki plik ma taki nagłówek?
kworr

@kworr to trochę głupie pytanie, każda różnica w ujednoliconym formacie ma nagłówki zakresów.
Yuval Adam

@YuvalAdam: w rzeczywistości ujednolicony format diff ma więcej pól, które powinny być wypełnione, takie jak [- +] <pozycja>, <linie> i tutaj nie mamy żadnych wyświetlonych zmian, ale te zmiany dotykają pierwszej linii pliku.
kworr

Odpowiedzi:


69

Jest to ujednolicony identyfikator porcji różnicowej. Jest to udokumentowane przez GNU Diffutils.

Ujednolicony format wyjściowy zaczyna się od dwuwierszowego nagłówka, który wygląda następująco:

--- z-pliku z-czasu-modyfikacji -pliku 
+++ do-pliku-czasu-modyfikacji-pliku

Wygląda na to, że znacznik czasu 2002-02-21 23:30:39.942229878 -0800wskazuje datę, czas z ułamkami sekund i strefę czasową. Ułamkowe sekundy są pomijane na hostach, które nie obsługują ułamkowych znaczników czasu.

Możesz zmienić zawartość nagłówka za pomocą --label=labelopcji; zobacz Zobacz Alternatywne nazwy .

Następnie pojawia się jedna lub więcej porcji różnic; każda porcja pokazuje jeden obszar, w którym pliki się różnią. Porcje w ujednoliconym formacie wyglądają następująco:

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

Jeśli porcja zawiera tylko jedną linię, pojawia się tylko jej numer linii początkowej. W przeciwnym razie wyglądają numery wierszy . Uważa się, że pusty fragment zaczyna się w linii, która następuje po nim.start,count

Jeśli porcja i jej kontekst zawierają dwie lub więcej linii, ich numery linii wyglądają tak . W przeciwnym razie pojawia się tylko numer linii końcowej. Uważa się, że pusty fragment kończy się na linii poprzedzającej fragment.start,count

Wiersze wspólne dla obu plików zaczynają się od znaku spacji. Wiersze, które faktycznie różnią się między dwoma plikami, mają jeden z następujących znaków wskazujących w lewej kolumnie drukowania:

  • +
    Linia została tutaj dodana do pierwszego pliku.
  • -
    Tutaj usunięto wiersz z pierwszego pliku.

69

Prosta analiza przykładu

Format jest w zasadzie taki sam, jak diff -u ujednolicona różnica.

Na przykład:

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

Tutaj usunęliśmy linie 2, 3, 14 i 15. Wyjście:

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

@@ -1,6 +1,4 @@ znaczy:

  • -1,6oznacza, że ​​ten fragment pierwszego pliku zaczyna się w linii 1 i zawiera łącznie 6 linii. Dlatego pokazuje linie od 1 do 6.

    1
    2
    3
    4
    5
    6
    

    -oznacza „stary”, jak zwykle go nazywamy diff -u old new.

  • +1,4oznacza, że ​​ten fragment drugiego pliku zaczyna się w linii 1 i pokazuje łącznie 4 linie. Dlatego pokazuje linie od 1 do 4.

    + oznacza „nowy”.

    Mamy tylko 4 linie zamiast 6, ponieważ 2 linie zostały usunięte! Nowa porcja to po prostu:

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ dla drugiej porcji jest analogicznie:

  • w starym pliku mamy 6 linii, zaczynając od linii 11 starego pliku:

    11
    12
    13
    14
    15
    16
    
  • w nowym pliku mamy 4 linie, zaczynając od linii 9 nowego pliku:

    11
    12
    13
    16
    

    Zauważ, że linia 11jest dziewiątą linią nowego pliku, ponieważ usunęliśmy już 2 linie z poprzedniej porcji: 2 i 3.

Nagłówek Hunk

W zależności od wersji i konfiguracji gita, możesz również pobrać linię kodu obok @@linii, np. In func1() {:

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

Można to również uzyskać za pomocą -pflagi zwykłej diff.

Przykład: stary plik:

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

Jeśli usuniemy linię 6, różnica pokazuje:

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

Zauważ, że to nie jest poprawna linia dla func1: pominęła linie 1i 2.

Ta niesamowita funkcja często mówi dokładnie, do której funkcji lub klasy należy każda porcja, co jest bardzo przydatne do interpretacji różnicy.

Jak dokładnie działa algorytm wyboru nagłówka, jest omówione w: Skąd pochodzi fragment nagłówka git diff hunk?


Ach, więc przeczytałbym @@ -1,6 +1,4 @@jako „Począwszy od linii 1, stara liczba linii wynosiła 6, ale nowa liczba linii to 4”
Chmura


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.