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.
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.
Odpowiedzi:
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-plikuWygląda na to, że znacznik czasu
2002-02-21 23:30:39.942229878 -0800
wskazuje 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=label
opcji; 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.
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,6
oznacza, ż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,4
oznacza, ż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 11
jest 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ą -p
flagi 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 1
i 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?
@@ -1,6 +1,4 @@
jako „Począwszy od linii 1, stara liczba linii wynosiła 6, ale nowa liczba linii to 4”
Jest to bieżąca informacja o zakresie porcji określająca, w których numerach linii zaczyna się i kończy ta porcja różnicowa.
Przeczytaj http://en.wikipedia.org/wiki/Diff#Unified_format, aby uzyskać szczegółowe wyjaśnienie.