Apakah ada cara agar git show baris ditambahkan, baris diubah dan baris dihapus?

110

"git diff --stat" dan "git log --stat" menunjukkan keluaran seperti:

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

Tetapi apa yang sebenarnya terjadi dalam komit itu adalah bahwa 4 baris diubah dan 26 baris dihapus yang berbeda dengan menambahkan 4 baris dan menghapus 30.

Apakah ada cara untuk mendapatkan LOC delta (26 dalam kasus ini)? Saya tidak terlalu peduli tentang membedakan antara garis yang ditambahkan atau dihapus.

Juan Alonso
sumber

Jawaban:

127

Kamu bisa memakai:

git diff --numstat

untuk mendapatkan informasi numerik diff.

Sejauh memisahkan modifikasi dari pasangan tambah dan hapus, --word-diffmungkin membantu. Anda bisa mencoba sesuatu seperti ini:

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

Agak bertele-tele jadi Anda mungkin ingin menguraikannya dalam skrip Anda sendiri.

quornian
sumber
2
Terima kasih quornian tetapi numstat memberikan info yang sama persis dengan stat, penambahan, dan penghapusan.
Juan Alonso
Memperbarui jawaban saya dengan menyertakan contoh penggunaan --word-diff. Itu mungkin lebih berguna.
quornian
14
Output dari git diff --numstatdipecah berdasarkan file. Untuk melihat total yang ditambahkan / dihapus untuk perbedaan tersebut, Anda dapat menyalurkannya ke awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
hughes
15
@hughes Cara yang lebih sederhana untuk mendapatkan informasi yang sama adalah git diff --shortstat. Dalam pengalaman saya, ini setara dengan mengumpulkan output dari git diff --numstat.
klaus triendl
1
Juga FWIW untuk melihat statistik perubahan bertahap, cukup tambahkan--cached
xlm
65
  1. Jika Anda ingin mengetahui baris yang ditambahkan / diubah / dihapus oleh komit dengan id commit-id, Anda dapat menggunakan

    git show commit-id --stat
    

    atau

    git diff commit-id-before commit-id --stat
    
  2. Jika Anda ingin mengetahui baris yang ditambahkan / diubah / dihapus oleh suatu rentang komit, Anda dapat menggunakan

    git diff commit-id1 commit-id2 --stat
    
  3. Jika Anda ingin mengetahui baris yang ditambahkan / diubah / dihapus oleh setiap komit, Anda dapat menggunakan

    git log --stat
    
yhluo
sumber
Solusi itu tidak menjawab pertanyaan, "git --stat" menghitung satu baris yang dimodifikasi sebagai "1 penyisipan dan 1 penghapusan". Pertanyaannya menanyakan bagaimana cara mengubah "1".
Juan Alonso
6

Jika semua file Anda dipentaskan untuk komit, untuk melihat --numstatprosesnya seperti ini:

git diff --numstat HEAD~
Falieson
sumber
4

git menggunakan diff "unified", yang hanya menambahkan dan menghapus baris, sebagai format diff. Anda harus melakukan sesuatu yang eksternal untuk mendapatkan diff yang menunjukkan menambah, menghapus, dan mengubah informasi.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git memberikan tautan ke skrip yang memungkinkan menjalankan "diff" lama biasa - dan dari situ Anda dapat menghasilkan keluaran diff "konteks" . Perbedaan konteks memang menunjukkan baris yang ditambahkan, dihapus, dan diubah, yang memungkinkan Anda mendapatkan data yang Anda inginkan.

Daniel Pittman
sumber
3

Anda dapat menggunakan diffstatuntuk menunjukkan jumlah baris yang dimodifikasi. Sebagai contoh:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

The -Cpilihan adalah untuk mendapatkan output colourised; yang -mpilihan adalah untuk menunjukkan jumlah baris yang diubah. Output sampel:

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

Hitungan jumlah baris yang dimodifikasi adalah perkiraan, seperti yang man diffstatdikatakan:

-m menggabungkan menyisipkan / menghapus hitungan dari setiap "potongan" file tambalan untuk memperkirakan jumlah baris yang dimodifikasi.

Satu perbedaan utama antara git diff --statdan diffstat: diffstattidak menunjukkan pemindahan / penggantian nama file (misalnya app/{a.rb => b.rb}).

Aliran
sumber