Bagaimana saya bisa menghitung jumlah baris yang diubah antara dua komit di git?


748

Apakah ada cara mudah untuk menghitung jumlah baris yang diubah antara dua commit di git?

Saya tahu saya bisa melakukan git diff, dan menghitung garis, tetapi ini sepertinya membosankan. Saya juga ingin tahu bagaimana saya bisa melakukan ini, termasuk hanya komit saya sendiri di linecounts.


3
Anda melihat BitBucket.
Alex78191

Jawaban:


1114

Anda ingin --statopsi git diff, atau jika Anda ingin menguraikannya dalam skrip, --numstatopsi.

git diff --stat <commit-ish> <commit-ish>

--stat menghasilkan output yang dapat dibaca manusia yang biasa Anda lihat setelah penggabungan; --numstatmenghasilkan tata letak tabel yang bagus yang dapat ditafsirkan dengan mudah oleh skrip.

Entah bagaimana saya merindukan bahwa Anda ingin melakukan ini di beberapa komit pada saat yang sama - itu tugas untuk git log. Ron DeVera menyentuh ini, tetapi Anda benar-benar dapat melakukan lebih dari apa yang ia sebutkan. Karena secara git loginternal memanggil mesin diff untuk mencetak informasi yang diminta, Anda dapat memberikannya opsi stat yang berbeda - bukan hanya --shortstat. Apa yang mungkin ingin Anda gunakan adalah:

git log --author="Your name" --stat <commit1>..<commit2>

tetapi Anda bisa menggunakan --numstatatau --shortstatjuga. git logjuga dapat memilih komit dengan berbagai cara lain - lihat dokumentasi . Anda mungkin tertarik pada hal-hal seperti --since(daripada menentukan rentang komit, cukup pilih komit sejak minggu lalu) dan --no-merges(gabungan komit tidak benar-benar memperkenalkan perubahan), serta opsi output yang cantik (--pretty=oneline, short, medium, full... ).

Berikut adalah satu-liner untuk mendapatkan perubahan total alih-alih perubahan per-komit dari git log (ubah opsi pemilihan komit seperti yang diinginkan - ini dilakukan oleh Anda, dari commit1 ke commit2):

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(Anda harus membiarkan git log mencetak beberapa informasi identitas tentang komit; Saya sewenang-wenang memilih hash, lalu menggunakan awk untuk hanya memilih garis dengan tiga bidang, yang merupakan informasi stat)


2
Ini tidak menjawab pertanyaan awal tentang "baris yang diubah". Satu perubahan baris dihitung sebagai baris yang dimasukkan dan dihapus. Menghitung jumlah baris yang diubah membutuhkan lebih banyak pekerjaan daripada yang dijelaskan di sini.
Ville Laitila

12
@VilleLaitila: Ini sedekat yang Anda bisa dapatkan tanpa upaya yang tidak masuk akal, dan itu cukup baik untuk OP dan 15 lainnya. (Bagaimana Anda menentukan kapan baris yang diubah menjadi baris yang ditambahkan dan baris yang dihapus? Dengan mengedit jarak antara baris - dan +, sebagai sebagian kecil dari panjang garis?) Kita semua tahu bahwa perubahan menjadi dua kali lipat; kita bisa menyebutnya metrik jumlah perubahan yang bermanfaat, dan melanjutkan kehidupan kita.
Cascabel

188
git diff --shortstat <commit1> <commit2>adalah yang saya inginkan.
Kim

9
Untuk referensi, format tanggal untuk --sincedan --untiladalah sesuatu seperti: yesterday, 1 month 2 weeks 3 days 1 hour 1 second ago, atau1979-02-26 18:30:00
juanmirocks

4
@ Bryson Ya, itu sebabnya baris itu mengatakan <commit-ish>- ia bekerja dengan apa pun yang mewakili komit, termasuk komit literal, cabang, tag, dan referensi pada umumnya. Lihat juga stackoverflow.com/questions/23303549/…
Cascabel

193

Untuk yang malas, gunakan git log --stat.


14
Saya menemukan ini berguna, menambahkan -10untuk menunjukkan sepuluh komit sebelumnya.
Choylton B. Higginbottom

2
Ketika Anda selesai melihat histori komit, ketik Quntuk kembali ke terminal.
Stevoisiak

180
git diff --shortstat

memberi Anda jumlah baris yang diubah dan ditambahkan. Ini hanya berfungsi dengan perubahan yang tidak dipentaskan. Untuk membandingkan dengan cabang:

git diff --shortstat some-branch

3
Keren! tapi .. ketahuilah bahwa ini hanya bekerja dengan perubahan yang tidak
dipentaskan

3
Jika Anda telah melakukan perubahan git add, pastikan untuk melakukannyagit diff --shortstat --cached
TomNash

2463 file berubah, 39745 penyisipan (+), 21383 penghapusan (-) Saya benar-benar menghapus sekitar 5k menjadi 10k pada bulan lalu. Ini hampir semua yang telah saya lakukan selain memindahkan barang-barang. Sesuatu yang salah. Itu tidak termasuk file yang dihapus atau sesuatu?
jgmjgm

46
git diff --stat commit1 commit2

EDIT: Anda harus menentukan komit juga (tanpa parameter itu membandingkan direktori kerja dengan indeks). Misalnya

git diff --stat HEAD^ HEAD

untuk membandingkan induk HEADdengan HEAD.


1
Tidak pernah benar-benar perlu digunakan diff-index- difffrontend dapat menangani semuanya; Kasus diff-indexini dicakup oleh --cached/--staged, saya percaya. (Dan tidak ada cara untuk diff-indexmembandingkan dua komit yang sewenang-wenang seperti yang diminta OP.)
Cascabel

Hasil dari ini tidak ada artinya bagi saya.
Mike

@ Mike: Apakah Anda meninggalkan karat? Apakah komit terbaru Anda melakukan komit? Jika git mengatakan tidak ada perbedaan, itu karena tidak ada perbedaan.
Cascabel

6
atau jika tidak terikatgit diff --stat HEAD
wieczorek1990

1
Selain itu, Anda dapat membandingkan lebih jauh dari sekadar menggunakan induk HEAD~n, di mana nsejauh mana Anda ingin kembali. git diff --stat HEAD~5 HEADakan menampilkan statistik gabungan untuk 5 komit terakhir relatif terhadap HEAD.
Nathan Beck

18

Dengan asumsi bahwa Anda ingin membandingkan semua komit Anda antara abcd123 (komit pertama) dan wxyz789 (komit terakhir), termasuk:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

Ini memberikan output ringkas seperti:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

Keluaran dari ini tidak ada artinya bagi saya (saya telah membuat dan memverifikasi --auter benar dengan menggunakannya dengan git log dan tidak ada argumen lain).
Mike

Ini juga terjadi pada saya. Dua komit berada dalam urutan yang salah, menukar mereka memperbaikinya.
bob esponja

1
Memperbarui perintah komit dan menjelaskan apa yang diwakili kedua SHA. Terima kasih telah menangkapnya :)
Ron DeVera

3
The --shortstatbendera mengagumkan, ia bekerja dengan git diffmeskipun (tidak git log).
lucke84

Bagaimana meringkasnya?
xpto

13

Cara lain untuk mendapatkan semua log perubahan dalam periode waktu tertentu

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

Keluaran:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

Dengan konten keluaran yang panjang, Anda dapat mengekspor ke file agar lebih mudah dibaca

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

Meskipun semua jawaban di atas benar, di bawah ini mudah digunakan jika Anda perlu menghitung banyak komit terakhir

di bawah satu adalah untuk mendapatkan hitungan 5 komitmen terakhir

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

untuk mendapatkan hitungan 10 komitmen terakhir

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

generik - ubah N dengan jumlah komit terakhir yang Anda butuhkan

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

untuk menghitung semua komitmen sejak awal

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


Ini memberi "'tail' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan atau file batch."
Charles Roddie


1

Saya baru saja memecahkan masalah ini untuk diri saya sendiri, jadi saya akan membagikan apa yang saya dapatkan. Inilah hasil akhirnya:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

Perintah yang mendasarinya terlihat seperti ini:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

Catat $@dalam perintah log untuk meneruskan argumen Anda seperti --author="Brian"atau--since=yesterday .

Melepaskan awk untuk memasukkannya ke git alias berantakan, jadi alih-alih, saya memasukkannya ke skrip yang dapat dieksekusi di jalur saya ( ~/bin/git-stat-sum), lalu menggunakan skrip di alias di .gitconfig:

[alias]
    summary = !git-stat-sum \"$@\"

Dan itu bekerja dengan sangat baik. Satu hal terakhir yang perlu diperhatikan adalah file changesjumlah perubahan pada file, bukan jumlah file unik yang diubah. Itu yang saya cari, tapi mungkin tidak seperti yang Anda harapkan.

Ini satu atau dua contoh lain

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

Sungguh, Anda harus dapat mengganti git logperintah dengan git summary.

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.