Git göster satırlarının eklenmesinin, satırların değiştirilmesinin ve satırların kaldırılmasının bir yolu var mı?


114

"git diff --stat" ve "git log --stat" çıktıları şöyle gösterir:

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
 app/controllers/application_controller.rb |   34 +++-------------------------
 1 files changed, 4 insertions(+), 30 deletions(-)

Ancak bu kayıtta gerçekten olan şey, 4 satırın eklenmesi ve 30 satırın silinmesinden farklı olarak 4 satırın değiştirilmesi ve 26 satırın silinmesiydi.

Delta LOC'leri almanın herhangi bir yolu var mı (bu durumda 26)? Eklenen veya çıkarılan satırları ayırt etmeyi gerçekten umursamıyorum.

Yanıtlar:


133

Kullanabilirsiniz:

git diff --numstat

sayısal fark bilgisi almak için.

Değişikliği bir ekle ve kaldır çiftinden ayırmak --word-diffyardımcı olabilir. Bunun gibi bir şey deneyebilirsin:

MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

Biraz uzun soluklu, bu yüzden onu kendi senaryonuzda ayrıştırmak isteyebilirsiniz.


2
Quornian'a teşekkürler ama numstat, stat, eklemeler ve silmelerle tam olarak aynı bilgileri veriyor.
Juan Alonso

Cevabım, örnek kullanımını içerecek şekilde güncellendi --word-diff. Bu daha yararlı olabilir.
quornian

16
Öğesinin çıktısı git diff --numstatdosyaya göre bölünmüştür. Fark için eklenen / çıkarılan toplamı görmek için, onu awk olarak yönlendirebilirsiniz:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
hughes

18
@hughes Aynı bilgiyi elde etmenin daha basit bir yolu olabilir git diff --shortstat. Benim deneyimlerime göre çıktısını biriktirmeye eşdeğerdir git diff --numstat.
klaus triendl

1
Ayrıca, aşamalı değişikliklerin istatistiklerini görmek için --cached
FWIW'yi

67
  1. İd'li bir commit ile eklenen / değiştirilen / silinen satırları bilmek commit-idistiyorsanız, kullanabilirsiniz

    git show commit-id --stat
    

    veya

    git diff commit-id-before commit-id --stat
    
  2. Bir aralık kaydetme tarafından eklenen / değiştirilen / silinen satırları bilmek istiyorsanız, şunu kullanabilirsiniz:

    git diff commit-id1 commit-id2 --stat
    
  3. Her kaydetme tarafından eklenen / değiştirilen / silinen satırları bilmek istiyorsanız, şunu kullanabilirsiniz:

    git log --stat
    

Bu çözüm soruyu yanıtlamaz, "git --stat" tek bir değiştirilmiş satırı "1 ekleme ve 1 silme" olarak sayar. Soru "1 değiştirmenin" nasıl yapılacağını sorar.
Juan Alonso

6

Tüm dosyalarınız kaydetme için hazırlandıysa, gidişatı şu şekilde görmek için --numstat:

git diff --numstat HEAD~

4

git, diff biçimi olarak yalnızca satır ekleyen ve silen "birleştirilmiş" diff kullanır. Ekleme, silme ve değiştirme bilgilerini gösteren bir fark elde etmek için harici bir şey yapmanız gerekir.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git , normal eski "fark" ın çalıştırılmasına izin veren bir betiğe bağlantılar verir - ve buradan bir "bağlam" fark çıktısı oluşturabilirsiniz. Bağlam farkı, istediğiniz verileri almanıza izin verecek şekilde eklenen, kaldırılan ve değiştirilen satırları gösterir.


4

diffstatDeğiştirilen satırların sayısını göstermek için kullanabilirsiniz . Örneğin:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

-CSeçenek renklendirilmiş çıktı almak içindir; -mseçenek modifiye satır sayısını gösteren içindir. Örnek çıktı:

 app/controllers/application_controller.rb |   30 -------------------!!!
 1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)

Değiştirilen satır sayısının sayısı yaklaşıktır, man diffstatdediği gibi:

-m birleştirme, değiştirilen satırların sayısını yaklaşık olarak hesaplamak için yama dosyasının her "yığınından" ekleme / silme sayılarını birleştir.

git diff --statVe diffstat: arasındaki önemli bir fark diffstat, dosya hareketlerini / yeniden adlarını göstermez (örneğin app/{a.rb => b.rb}).

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.