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.

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.


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
    

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~

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.


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}).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.