Git'in diff çıktısında “@@ -1 +1 @@” ne anlama geliyor?


104

Şu kaynaktan döndürülen bilgilerden veri topluyorum

git diff <commitId>..<commitId>

ve karşılaştım @@ -1 +1 @@

Bana ne söylediğini anlayamıyorum. Google'da biraz aradım ama işe yaramadı.


Hangi dosyanın böyle bir başlıkla sonuçlandığını açıklayabilir misiniz?
kworr

@kworr bu biraz saçma bir soru, birleşik formattaki herhangi bir farkın aralık başlıkları var.
Yuval Adam

@YuvalAdam: aslında diff birleşik formatta [- +] <position>, <lines> gibi doldurulması gereken daha fazla alan var ve burada görüntülenecek hiçbir değişiklik yok ama bu değişiklik dosyanın ilk satırına dokunuyor.
kworr

Yanıtlar:


69

Bu birleşik bir diff hunk tanımlayıcısıdır. Bu edilir belgelenmiş GNU diffutils tarafından.

Birleşik çıktı biçimi, aşağıdaki gibi görünen iki satırlık bir başlık ile başlar:

--- dosyadan-dosyadan-değiştirme-zamanı 
+++ dosyadan-dosyaya-değişiklik-zamanı

Zaman damgası 2002-02-21 23:30:39.942229878 -0800, tarihi, kesirli saniye ile saati ve saat dilimini belirtiyor gibi görünür . Kesirli zaman damgalarını desteklemeyen ana makinelerde kesirli saniyeler atlanır.

Başlık içeriğini şu --label=labelseçenekle değiştirebilirsiniz; bkz . Alternatif Adlar .

Sonra bir veya daha fazla farklılıklar ortaya çıkıyor; her bir iri parça, dosyaların farklı olduğu bir alanı gösterir. Birleşik biçim gövdeleri şuna benzer:

@@ dosyadan-satır-numaralarından dosya-satır numaralarına @@
  dosyadan-her iki dosyadan-her iki dosyadan 
 satır ...

Bir hunk yalnızca bir satır içeriyorsa, yalnızca başlangıç ​​satırı numarası görünür. Aksi takdirde satır numaraları şöyle görünür . İri parçayı takip eden satırda boş bir iri parça başladığı kabul edilir.start,count

Bir hunk ve bağlamı iki veya daha fazla satır içeriyorsa, satır numaraları şöyle görünür . Aksi takdirde yalnızca bitiş satır numarası görünür. Boş bir iri parça, iri parçadan önceki satırda bitiyor olarak kabul edilir.start,count

Her iki dosyada ortak olan satırlar bir boşluk karakteriyle başlar. İki dosya arasında gerçekte farklı olan satırlar, sol yazdırma sütununda aşağıdaki gösterge karakterlerinden birine sahiptir:

  • +
    Buraya ilk dosyaya bir satır eklendi.
  • -
    İlk dosyadan burada bir satır kaldırıldı.

69

Basit örnek analizi

Biçim temelde diff -ubirleşik fark ile aynıdır .

Örneğin:

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

Burada 2, 3, 14 ve 15. satırları kaldırdık. Çıktı:

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

@@ -1,6 +1,4 @@ anlamına geliyor:

  • -1,6ilk dosyanın bu parçasının 1. satırda başladığı ve toplam 6 satır gösterdiği anlamına gelir. Bu nedenle 1'den 6'ya kadar olan satırları gösterir.

    1
    2
    3
    4
    5
    6
    

    -genellikle çağırdığımız gibi "eski" anlamına gelir diff -u old new.

  • +1,4ikinci dosyanın bu parçasının 1. satırda başladığı ve toplam 4 satır gösterdiği anlamına gelir. Bu nedenle 1'den 4'e kadar olan satırları gösterir.

    + "yeni" anlamına gelir.

    6 yerine sadece 4 hattımız var çünkü 2 satır kaldırıldı! Yeni iri parça sadece:

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ ikinci iri parça için benzer:

  • eski dosyada, eski dosyanın 11. satırından başlayan 6 satırımız var:

    11
    12
    13
    14
    15
    16
    
  • yeni dosyada, yeni dosyanın 9. satırından başlayan 4 satırımız var:

    11
    12
    13
    16
    

    Bu satırın 11yeni dosyanın 9. satırı olduğuna dikkat edin çünkü önceki hunk'ta 2 satırı zaten kaldırdık: 2 ve 3.

Hunk başlığı

Git sürümünüze ve yapılandırmanıza bağlı olarak, satırın yanında bir kod satırı da alabilirsiniz @@, örneğin func1() {:

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

Bu aynı zamanda, elde edilebilir -p, düz bayrağı diff.

Örnek: eski dosya:

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

Satırı kaldırırsak 6, fark şunu gösterir:

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

Bunun için doğru satır olmadığını unutmayın func1: satırları atladı 1ve 2.

Bu harika özellik genellikle her bir parçanın hangi işleve veya sınıfa ait olduğunu söyler, bu da diff'i yorumlamak için çok kullanışlıdır.

Başlığı seçme algoritmasının tam olarak nasıl çalıştığı şu adreste tartışılmaktadır: git diff hunk başlığındaki alıntı nereden geliyor?


Ah, bu yüzden @@ -1,6 +1,4 @@"1. satırdan başlıyor, eski satır sayısı 6 ama yeni satır sayısı 4"
Cloud


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.