Satır numaralarına sahip Git farkı (satır numaraları ile Git günlüğü)


93

A git diffveya a git log -pyaptığımda, kaynak dosya (lar) ın satır numaralarını çıktıyla birlikte nasıl alabilirim?

Aramaya çalıştım man git-diff | grep "line numbers"ve googling yapmayı denedim ama çabucak hiçbir şey alamadım.

Yanıtlar:


92

İnsan tarafından okunabilir satır numaralarını alamazsınız git diff

Şu anda satır numaralarının yanında dikey olarak görüntülenmesi için herhangi bir seçenek bulunmamaktadır git diff.

Birleşik fark biçimi

Bu bilgi, diff'deki her değişiklik için (c) hunk başlıklarında mevcuttur, ancak sadece birleşik-diff biçiminde :

@@ -start,count +start,count @@

Dosyanın orijinal durumu ile temsil edilir -ve yeni durum ile temsil edilir +(bunlar hunk başlığındaki eklemeler ve silmeler anlamına gelmez. startDosyanın her sürümünün başlangıç ​​satır numarasını counttemsil eder ve kaç satırın dahil edildiğini temsil eder. , başlangıç ​​noktasından başlayarak.

Misal

diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
 [color "branch"]
        upstream = cyan
 [color "diff"]
-       meta = yellow
+       meta = cyan
        plain = white dim
        old = red bold
        new = green bold

Hunk başlık

@@ -11,7 +11,7 @@

dosyanın önceki sürümünün 11. satırda başladığını ve 7 satır içerdiğini söylüyor:

11  [color "branch"]
12         upstream = cyan
13  [color "diff"]
14 -       meta = yellow
14 +       meta = cyan
15         plain = white dim
16         old = red bold
17         new = green bold

dosyanın bir sonraki sürümü de 11. satırda başlar ve ayrıca 7 satır içerir.

Birleşik diff formatı gerçekten insan tüketimi için uygun değil

Muhtemelen söyleyebileceğiniz gibi, birleşik fark biçimi, satır numaralarını anlamayı kolaylaştırmaz (en azından bir makine değilseniz). Okuyabileceğiniz satır numaralarını gerçekten istiyorsanız, bunları sizin için gösterecek bir farklılaştırma aracı kullanmanız gerekir.

Ek Okuma


4
İşte sadece değiştirilmiş dosyalardaki satır numaralarını çıkarmak için bir grep, örneğin bir kontrol git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'
stili

1
@ JakubBochenski'nin yorumu sorunumu oldukça güzel bir şekilde çözdü.
0xbe5077ed

Bu, yalnızca belirtirseniz --unified=0veya -U0yine de gerçekten yararlıdır .
19'19

Yeni bitirdim git diffn, git diffsatır numaralarını gösteren ve tüm kullanım ve seçeneklerle tam uyumlu olan bir drop-in değiştirme (sarmalayıcı) git diff: stackoverflow.com/questions/24455377/…
Gabriel Staples

22

Andy Talkowski'nin kodunu genişleten iki çözüm daha.

Düz metin:

  git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
   /^(---|\+\+\+|[^-+ ])/{print;next};\
   {line=substr($0,2)};\
   /^-/{print "-" left++ ":" line;next};\
   /^[+]/{print "+" right++ ":" line;next};\
   {print "(" left++ "," right++ "):"line}'

\033[66mRenk kodlarının formatı olduğu varsayılarak renkli metin :

  git diff --color=always | \
    gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
      match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
      bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
      {line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
      bare~/^-/{print "-"left++ ":" line;next};\
      bare~/^[+]/{print "+"right++ ":" line;next};\
      {print "("left++","right++"):"line;next}'

Kod ile başlayan satırları değiştirir -ve +hiç -1:-ve +1:+hiçbir şey ile başlar sırasıyla, ve çizgileri için (5,6):. Numaralar, ilgili dosyadaki satır numaralarıdır.


Kodun hizalamasını (girintisini) kırdığını, oysa native'nin git diffhizalamayı dikkatlice koruduğunu fark ettim . Bu kod şu anda kafamın üzerinde, bu yüzden düzeltmek ister misiniz? Başka bir deyişle, bir satır +240:+ve sonraki satır dediğinde (241,257):, kodunun alt satırdaki kodla düzgün hizalamayı ve girintiyi korumasını sağlamak için üst satıra fazladan boşluklar eklemeniz gerekir. Belki bu baskı ile kolayca yapılabilir?
Gabriel Staples

... ile demek istiyorum printf.
Gabriel Staples


Boşver; Anladım! Sadece bitmiş git diffn. Buraya bakın: stackoverflow.com/a/61997003/4561887 . Cevabınız için teşekkürler @PFudd. Onu inceledim ve öğrenmek için kullandım, sonra sıfırdan başladım ve yazdım git diffn. Kodunuzu okuyabilmem için biçimlendirildikten sonra (teşekkürler @EdMorton), ondan bana yardımcı olan bazı harika şeyler öğrenebildim.
Gabriel Staples

6

İşte bunu düzeltmeye çalışan bir komut dosyası - öfkeyle test edilmedi ama iyi görünüyor. Git diff'in ürettiği kayıtlara dayanır ve satır sayılarını korumak için awk kullanır.

# Massage the @@ counts so they are usable
function prep1() {
   cat | awk -F',' 'BEGIN { convert = 0; }
       /^@@ / { convert=1; }
       /^/  { if ( convert == 1 ) { print $1,$2,$3;
              } else { print $0;
              }
              convert=0;
             }'
}

# Extract all new changes added with the line count
function prep2() {
  cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
     /^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line;        }
     /^[-]/   { left++; display=left; inc=0; }
     /^[+]/   { line++; display=line; inc=0; }
     /^[-+][-+][-+] / { out=0; inc=0; }
     /^/    { 
               line += inc;
               left += inc;
               display += inc;
               if ( out == 1 ) {
                   print display,$0;
               } else {
                   print $0;
               }
               out = 1;
               inc = 1;
               display = line;
            }'
} 

git diff $1 | prep1 | prep2 

4

git difftoolFarkı, satır numaralarını görüntüleyecek harici bir düzenleyiciyle yapmak için kullanabilirsiniz . İşte bunu vim / vimdiff ile nasıl yapacağınız:

  1. Vimdiff'i git'in difftool'u olarak ayarlayın:

    git config --global diff.tool vimdiff
    
  2. ~/.vimrcVimdiff kullanırken satır numaralarını otomatik olarak gösterecek şekilde yapılandırın :

    if &diff
        set number
    endif
    
  3. Vimdiff'i satır numaraları ile kullanacak git difftool'u çalıştırın:

    git difftool
    

Sadece git difftool yaparak, kendisinin satır numarası fonksiyonuna sahip olduğu tkdiff aracını benim için açtı. Teşekkürler Wisbucky
Richardd

4

Hızlı bir yol kullanmaktır git diff -U0. Bu, bağlam satırlarını 0 olarak ayarlayacak ve @@ değerlerinin gerçek değiştirilmiş satırlarla eşleşmesini sağlayacaktır. Varsayılan olarak @@ değerleri, insanlar için uygun olmayan bağlamdan önce / sonra 3 satır içerir.

Misal:

git diff # default
@@ -10,8 +10,8 @@

Bu, değiştirilen satırların satır numaralarını hesaplamak zordur çünkü 10. satır, önceki bağlamın ilk satırına atıfta bulunur. İlk değiştirilen satırın gerçek satır numarası 10 + 3 = 13'tür. Değiştirilen satırların sayısını hesaplamak için, önce ve sonra bağlamını da çıkarmanız gerekir: 8-3-3 = 2.

git diff -U0
@@ -13,2 +13,2 @@

Gördüğünüz gibi, bağlam = 0 olarak ayarlamak, @@ değerlerini insanların okumasını kolaylaştırır. Değiştirilen satırların 13. satırdan başladığını ve 2 değiştirilmiş satır olduğunu görebilirsiniz.

Bu mükemmel değildir çünkü sadece her bloğun satır numarasını gösterir. Her satırın satır numaralarını görmek istiyorsanız, harici bir düzenleyici için difftool kullanın. Bkz. Https://stackoverflow.com/a/50049752


3

Diftool olarak meldgit difftool ile kullanmayı seviyorum. Bakmaktan daha kolay , yan yana güzel bir gui karşılaştırması var ve her iki tarafta satır numaralarını gösteriyor.git diff

Kurmak:

  1. Windows veya Linux için diftool olarak meld'yi nasıl kuracağınıza dair talimatlar

Örnek Ekran Görüntüsü:

görüntü açıklamasını buraya girin

24 Mayıs 2020 Güncellemesi:

git diffnSon birkaç gündür git diffkomut satırının yerine geçecek bir yer yazdım . Bi dene. Diğer cevabımı burada görün .


3

24 Mayıs 2020 itibariyle, artık git diffnbu amaç için üçüncü taraf aracını (tam açıklama: yazdım) kullanabilirsiniz. Bu git diff, awkkalıp / eylem tabanlı programlama dilinde yazılmış, etrafta hafif bir paketleyicidir . İşte çalıştırmanın örnek bir çıktısı git diffn:

görüntü açıklamasını buraya girin

1/3: Nedir?

Şunun başındangit-diffn.sh :

AÇIKLAMA:

git-diffn.sh

  1. git diffayrıca satır 'n' sayılarını gösteren bir drop-in yedeği! Kullanın aynen böyle git diffsize değişiklikleri anlayabilir iyi yardımına olarak bu güzel satır numaralarını göreceksiniz hariç.

  2. sadece hafif bir awk dili tabanlı sarmalayıcı olduğundan git diff, kabul eden TÜM seçenekleri ve parametreleri git diffkabul eder. Örnekler:

  3. git diffn HEAD~

  4. git diffn HEAD~3..HEAD~2

  5. git diffözel renkler kullanıyor olsanız bile renk ayarlarınızdan herhangi biriyle çalışır

  6. Özel farklı renkleri nasıl ayarlayacağımı ve özel renk çıktısının ekran görüntüsünü nasıl göreceğimi öğrenmek için cevabıma buradan bakın git diffn: Git diff'deki diff başlığının rengini nasıl özelleştirirsiniz?

  7. git configÖzel git diffrenkler ve nitelikler (metin biçimlendirme) ayarlamak için yukarıdaki cevabımdan bazı örnek komutlar :

       git config --global color.diff.meta "blue"
       git config --global color.diff.old "black red strike"
       git config --global color.diff.new "black green italic"
       git config --global color.diff.context "yellow bold"
    
  8. içinde git diffnrenk çıktı varsayılan olarak AÇIK; çıktı rengini devre dışı bırakmak istiyorsanız, --no-colorveya kullanmanız gerekir --color=never. Ayrıntılar man git diffiçin bakın. Örnekler:

     git diffn --color=never HEAD~
     git diffn --no-color HEAD~3..HEAD~2
    

2/3: Kurulum

  1. Windows (test edilmemiş): Bu, Windows için Git ile birlikte gelen bash terminalinin içinde çalışabilir , ancak test edilmemiştir. Windows için Git'i yükleyin. Birlikte gelen bash terminalini açın ve aşağıdaki talimatları izlemeye çalışın. Bunu Windows için Git'te test edecek bazı test uzmanlarına ihtiyacım var. Lütfen buraya bakın ve yanıtlayın: https://github.com/git-for-windows/git/issues/2635 .
  2. Mac (test edilmemiş): terminali kullanın ve aşağıdaki talimatları izleyin. Yüklemeniz gerekebilir gawk. Eğer öyleyse, deneyin bu : brew install gawk.
  3. Linux (Ubuntu 18.04'te test edildi ve mükemmel çalışıyor): aşağıdaki terminal talimatlarını izleyin.

Seçenek 1 (tavsiyem): Tüm depoyu indirin ve ardından programa bir sembolik bağlantı oluşturun, böylece git pullistediğiniz zaman depodan bir yaparak güncellemeleri kolayca alabilirsiniz .

Öncelikle, cdbunu kurmak istediğiniz yere. O zaman koş:

git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn

Bitti! Şimdi sadece aşağıdaki son adımı gerçekleştirin!

2. Seçenek (sadece 1 dosyayı isteyenler için): Bir seferde sadece bir dosyayı indirin.

mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn

Bitti! Şimdi sadece aşağıdaki son adımı gerçekleştirin!

Son adım:

Şimdi terminalinizi kapatıp yeniden açın veya ile yeniden kaynak yapın . ~/.bashrc, işte bu kadar!

git diffnşimdi tam bir drop-in yerine geçecek git diff!

İşte bir demo:

3/3: Demo git diffn:

Bu dosyayı oluşturun:

hello_world.c:

#include <stdio.h>

int main()
{
    printf("Hello World\n");

    return 0;
}

Teslim et:

git add hello_world.c
git commit -m "add hello_world.c"

Buna değiştirin ve dosyayı kaydedin:

hello_world.c:

// Basic hello world example

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello Gabriel\n");
    
    int i = 700;
    printf("i = %i\n", i);
    return 0;
}

Şimdi çalıştırın:

git diff

git diffKarşılaştırma amaçlı ilk çıktı şu şekildedir:

$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
 #include <stdio.h>
 
-int main()
+int main(int argc, char *argv[])
 {
-    printf("Hello World\n");
-
+    printf("Hello Gabriel\n");
+    
+    int i = 700;
+    printf("i = %i\n", i);
     return 0;
-}
\ No newline at end of file
+}

Ve rengi göstermek için bir ekran görüntüsü. Kırmızı ile vurgulanan bölümün, silinebilecek boş beyaz boşlukları (bu durumda boşluklar) gösterdiğini unutmayın:

görüntü açıklamasını buraya girin

Şimdi işte çıktı git diffn. Tüm satır numaralarını mükemmel şekilde gösterdiğine dikkat edin!

  • Silinen satırlar için satır numaraları solda yer alır ve daha iyi görmenize yardımcı olmak -için hem en solunda hem de sağında bir işaret gösterir :- gözleriniz ister kolonun sağına, ister uzaklara doğru taramak ister ekranın solunda.
  • Eklenen satırlar için satır numaraları daha sağdadır ve satırın+ hem en solunda hem de sağında bir işaret gösterir :.
  • Bağlam için gösterilen değişmemiş satırlar için satır numaraları hem sol (eski dosya) hem de sağ (yeni dosya) için a ile ayrılmış olarak gösterilir ,.

Çıktı git diffn:

$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+        1:+// Basic hello world example
+        2:+
    1,   3: #include <stdio.h>
    2,   4: 
-   3     :-int main()
+        5:+int main(int argc, char *argv[])
    4,   6: {
-   5     :-    printf("Hello World\n");
-   6     :-
+        7:+    printf("Hello Gabriel\n");
+        8:+    
+        9:+    int i = 700;
+       10:+    printf("i = %i\n", i);
    7,  11:     return 0;
-   8     :-}
\ No newline at end of file
+       12:+}

Ve rengi göstermek için bir ekran görüntüsü. İki nokta üst üste işaretlerinin, soldaki ve sağdaki çevreleyen metinle eşleşecek şekilde renkli veya stilize OLMADIĞINA dikkat edin. Bu, kasıtlı ve solda eklenen satır numaraları git diffile sağdaki orijinal çıktı arasında görsel bir ayırıcı görevi görecek şekilde tasarlanmış bir davranıştır .

görüntü açıklamasını buraya girin


1

Deneyebilirsin

git blame

dosyada. Dosyadaki her satır için kaydedici, commit kimliği ve satır numarasını gösterir.


4
Bununla ilgili sorun, size bir farklılık göstermemesi , ki bu da orijinal posterin istediği şey. git blamesadece dosyanın mevcut durumunu satır numaraları ile gösterecektir.

5
Git blame'ı biliyordum, ancak googling yapan biri bilmiyor olabilir. Birine yardımcı olabilir. Cevabın için teşekkür ederim.
Drew LeSueur

git blamesoruyu hiçbir şekilde yanıtlamaz; Buradaki olumlu oylar beni oldukça şaşırttı
Michael

Lütfen yığın akışını sorularla ilgili olmayan yanıtlarla spam yapmayın.
Ahmed

0

İlk olarak, git diff aracınızı yapılandırın, örneğin Meld

git config --global diff.tool meld

Ardından, difftool'unuzu bir dosyaya kopyalayın:

git difftool -y config.rb

Fark aracınızın tercihinde satır numarasını ayarlamayı unutmayın.

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.