Was bedeutet "@@ -1 +1 @@" in der Diff-Ausgabe von Git?

103

Ich habe Daten aus den zurückgegebenen Informationen gesammelt

git diff <commitId>..<commitId>

und ich lief in @@ -1 +1 @@

Ich kann nicht herausfinden, was mir das sagt. Ich habe ein bisschen bei Google gesucht, aber ohne Erfolg.

SSEMember
quelle
Können Sie beschreiben, welche Datei zu einem solchen Header führt?
Kworr
@kworr das ist eine dumme Frage, jeder Unterschied im einheitlichen Format hat Bereichskopfzeilen.
Yuval Adam
@YuvalAdam: Tatsächlich hat das einheitliche Diff-Format mehr Felder, die wie [- +] <Position>, <Zeilen> ausgefüllt werden sollten, und hier werden keine Änderungen angezeigt, aber diese Änderungen berühren die erste Zeile der Datei.
Kworr

Antworten:

69

Es ist eine einheitliche Diff-Hunk-Kennung. Dies wird von GNU Diffutils dokumentiert .

Das einheitliche Ausgabeformat beginnt mit einem zweizeiligen Header, der folgendermaßen aussieht:

--- von-Datei von-Datei-Änderungszeit 
+++ zu-Datei zu-Datei-Änderungszeit

Der Zeitstempel 2002-02-21 23:30:39.942229878 -0800zeigt Datum, Uhrzeit in Sekundenbruchteilen und Zeitzone an. Die Bruchsekunden werden auf Hosts weggelassen, die keine Bruchzeitstempel unterstützen.

Sie können den Inhalt des Headers mit der --label=labelOption ändern . Siehe Siehe Alternative Namen .

Als nächstes kommen ein oder mehrere Unterschiede; Jedes Stück zeigt einen Bereich, in dem sich die Dateien unterscheiden. Unified Format Hunks sehen folgendermaßen aus:

@@ von-Datei-Zeilennummern zu-Datei-Zeilennummern @@
  Zeile-von-jeder-Datei 
 Zeile-von-jeder-Datei ...

Wenn ein Stück nur eine Zeile enthält, wird nur seine Startzeilennummer angezeigt. Ansonsten sehen die Zeilennummern so aus . Ein leeres Stück beginnt an der Linie, die dem Stück folgt.start,count

Wenn ein Stück und sein Kontext zwei oder mehr Zeilen enthalten, sehen seine Zeilennummern so aus . Andernfalls wird nur die Endzeilennummer angezeigt. Es wird davon ausgegangen, dass ein leeres Stück an der Zeile endet, die dem Stück vorausgeht.start,count

Die beiden Dateien gemeinsamen Zeilen beginnen mit einem Leerzeichen. Die Zeilen, die sich zwischen den beiden Dateien tatsächlich unterscheiden, haben eines der folgenden Kennzeichen in der linken Druckspalte:

  • +
    Hier wurde der ersten Datei eine Zeile hinzugefügt.
  • - Hier wurde
    eine Zeile aus der ersten Datei entfernt.
Todd A. Jacobs
quelle
68

Einfache Beispielanalyse

Das Format ist im Grunde das gleiche wie das diff -ueinheitliche Diff.

Zum Beispiel:

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

Hier haben wir die Zeilen 2, 3, 14 und 15 entfernt. Ausgabe:

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

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

  • -1,6bedeutet, dass dieses Stück der ersten Datei in Zeile 1 beginnt und insgesamt 6 Zeilen zeigt. Daher werden die Zeilen 1 bis 6 angezeigt.

    1
    2
    3
    4
    5
    6
    

    -bedeutet "alt", wie wir es normalerweise als aufrufen diff -u old new.

  • +1,4bedeutet, dass dieses Stück der zweiten Datei in Zeile 1 beginnt und insgesamt 4 Zeilen anzeigt. Daher werden die Zeilen 1 bis 4 angezeigt.

    + bedeutet "neu".

    Wir haben nur 4 statt 6 Zeilen, da 2 Zeilen entfernt wurden! Das neue Stück ist nur:

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ für das zweite Stück ist analog:

  • In der alten Datei haben wir 6 Zeilen, beginnend mit Zeile 11 der alten Datei:

    11
    12
    13
    14
    15
    16
    
  • In der neuen Datei haben wir 4 Zeilen, beginnend mit Zeile 9 der neuen Datei:

    11
    12
    13
    16
    

    Beachten Sie, dass die Zeile 11die 9. Zeile der neuen Datei ist, da wir bereits 2 Zeilen auf dem vorherigen Hunk entfernt haben: 2 und 3.

Hunk-Header

Je nach Ihrer git - Version und Konfiguration können Sie auch eine Codezeile neben der bekommen @@Linie, zum Beispiel des func1() {in:

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

Dies kann auch mit der -pFlagge der Ebene erhalten werden diff.

Beispiel: alte Datei:

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

Wenn wir die Linie entfernen 6, zeigt der Unterschied :

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

Beachten Sie, dass dies nicht die richtige Zeile ist für func1: Es wurden Zeilen 1und übersprungen 2.

Diese großartige Funktion sagt oft genau, zu welcher Funktion oder Klasse jedes Stück gehört, was sehr nützlich ist, um den Unterschied zu interpretieren.

Wie der Algorithmus zur Auswahl des Headers genau funktioniert, wird unter folgender Adresse erläutert: Woher kommt der Auszug im git diff hunk-Header?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
Ah, also würde ich lesen @@ -1,6 +1,4 @@als "Ab Zeile 1 war die alte Zeilenanzahl 6, aber die neue Zeilenanzahl ist 4"
Cloud
1
@Cloud yup das war's :-)
Ciro Santilli 1 冠状 病 病 六四 事件 1.
6

Es sind die aktuellen Informationen zum Hunk-Bereich, die angeben, auf welchen Zeilennummern dieser Diff-Hunk beginnt und endet.

Eine ausführliche Erklärung finden Sie unter http://en.wikipedia.org/wiki/Diff#Unified_format .

Yuval Adam
quelle
Vielen Dank. Aushelfen. Wenn es kein nachfolgendes Komma und s gibt, ist der
Standardwert