Apakah ada cara untuk membuat git memberi Anda log komit hanya untuk komit yang menyentuh baris tertentu dalam file?
Suka git blame
, tetapi git blame
akan menunjukkan Anda komit TERAKHIR yang menyentuh garis tertentu.
Saya benar-benar ingin mendapatkan log serupa, bukan daftar commit di mana saja dalam file, tetapi hanya commit yang menyentuh baris tertentu.
Jawaban:
Lihat juga Git: temukan komit yang pernah menyentuh serangkaian garis .
Sejak Git 1.8.4 ,
git log
harus-L
melihat evolusi berbagai garis.Sebagai contoh, misalkan Anda melihat
git blame
output. Di sini-L 150,+11
berarti "hanya melihat garis 150 hingga 150 + 11":Dan Anda ingin tahu sejarah garis 155 sekarang.
Lalu, gunakan
git log
. Di sini,-L 155,155:git-web--browse.sh
berarti "melacak evolusi baris 155 hingga 155 dalam file bernamagit-web--browse.sh
".sumber
git log commitA-hash -L 155,155:file-name
?Anda bisa mendapatkan satu set komit dengan menggunakan kapak.
Ini akan memberi Anda semua komit yang mempengaruhi teks dalam file itu. Jika file diubah namanya di beberapa titik, Anda dapat menambahkan --follow-parent.
Jika Anda ingin memeriksa komit di masing-masing suntingan ini, Anda dapat mengirimkan hasilnya ke git show:
sumber
git log -S'the previous version of the line'
dan seterusnya, persis seperti Anda akhirnya akan melakukannyagit blame -L
. Dan itu akan jauh lebih lambat daripadagit blame
, karena harus mencari teks di mana-mana, tidak hanya di tempat tertentu.Coba gunakan perintah di bawah ini diimplementasikan dalam Git 1.8.4.
Jadi, dalam kasus Anda
upperLimit
&lowerLimit
adalah tersentuhline_number
Info lebih lanjut - https://www.techpurohit.com/list-some-useful-git-commands
sumber
--pretty=short
diabaikan ketika menggunakan-L
. Harap perbaikiCara yang sangat mudah untuk melakukan ini adalah dengan menggunakan pelarian-vim . Cukup buka file dalam vim, pilih baris yang ingin Anda gunakan
V
, lalu masukkanSekarang Anda dapat menggunakan
:cnext
dan:cprev
untuk melihat semua revisi file di mana baris itu diubah. Kapan saja, masukkan:Gblame
untuk melihat info sha, penulis, dan tanggal.sumber
Menyederhanakan jawaban @ matt -
git blame -L14,15 -- <file_path>
Di sini Anda akan disalahkan untuk sebuah dialog
14 to 15
.Karena
-L
opsi mengharapkanRange
sebagai param kita tidak bisa mendapatkanBlame
untuk satu baris menggunakan-L
opsi` .Referensi
sumber
Saya tidak percaya ada sesuatu yang built-in untuk ini. Itu dibuat rumit oleh kenyataan bahwa jarang satu baris berubah beberapa kali tanpa sisa file berubah secara substansial juga, jadi Anda akan cenderung berakhir dengan nomor baris banyak berubah.
Jika Anda cukup beruntung bahwa baris selalu memiliki beberapa karakteristik pengidentifikasian, misalnya tugas untuk variabel yang namanya tidak pernah berubah, Anda bisa menggunakan pilihan regex untuk
git blame -L
. Sebagai contoh:Tetapi ini hanya menemukan kecocokan pertama untuk regex itu, jadi jika Anda tidak memiliki cara yang baik untuk mencocokkan garis, itu tidak terlalu membantu.
Anda bisa meretas sesuatu, saya kira. Saya tidak punya waktu untuk menulis kode barusan, tapi ... sesuatu seperti ini. Lari
git blame -n -L $n,$n $file
. Field pertama adalah sebelumnya komit menyentuh, dan kolom kedua adalah jumlah baris dalam yang komit, karena bisa saja berubah. Ambil itu, dan jalankangit blame -n $n,$n $commit^ $file
, yaitu hal yang sama dimulai dari komit sebelum terakhir kali file diubah.(Perhatikan bahwa ini akan mengecewakan Anda jika komit terakhir yang mengubah baris adalah komit gabungan. Cara utama ini bisa terjadi jika baris diubah sebagai bagian dari resolusi konflik gabungan.)
Sunting: Saya kebetulan berada di pos milis ini sejak Maret 2011 hari ini, yang menyebutkan itu
tig
dangit gui
memiliki fitur yang akan membantu Anda melakukan ini. Sepertinya fitur tersebut telah dipertimbangkan, tetapi belum selesai, untuk git itu sendiri.sumber
Ini akan memanggil
git blame
untuk setiap revisi yang berarti untuk menunjukkan baris$LINE
file$FILE
:Seperti biasa, kesalahan menunjukkan nomor revisi di awal setiap baris. Anda bisa menambahkan
untuk mendapatkan hasil agregat, sesuatu seperti daftar komit yang mengubah baris ini. (Tidak sepenuhnya, jika kode hanya telah dipindahkan, ini mungkin menunjukkan ID komit yang sama dua kali untuk konten baris yang berbeda. Untuk analisis yang lebih rinci Anda harus melakukan perbandingan
git blame
hasil yang tertinggal untuk komit yang berdekatan. Siapa saja? )sumber
Ini adalah solusi yang mendefinisikan alias git, jadi Anda bisa menggunakannya seperti itu:
Contoh keluaran:
Anda dapat mendefinisikan alias di .gitconfig Anda atau cukup menjalankan perintah berikut
Ini adalah one-liner jelek, jadi di sini adalah fungsi bash setara yang tidak dikaburkan:
Solusi beliung ( git log --pickaxe-regex -S'REGEX ' ) hanya akan memberi Anda penambahan baris / penghapusan, bukan perubahan lain dari baris yang berisi ekspresi reguler.
Keterbatasan solusi ini adalah bahwa git menyalahkan hanya mengembalikan pertandingan REGEX 1, jadi jika ada beberapa pertandingan rekursi dapat "melompat" untuk mengikuti baris lain. Pastikan untuk memeriksa keluaran riwayat lengkap untuk menemukan "lompatan" itu dan kemudian perbaiki REGEX Anda untuk mengabaikan garis parasit.
Akhirnya, berikut adalah versi alternatif yang menjalankan git show pada setiap commit untuk mendapatkan perbedaan penuh:
sumber
Anda dapat menggabungkan
git blame
dangit log
memerintahkan untuk mengambil ringkasan dari setiap komit di perintah git menyalahkan dan menambahkannya. Sesuatu seperti skrip bash + awk berikut. Ini menambahkan ringkasan komit sebagai inline komentar kode.Dalam satu baris:
sumber
Dalam kasus saya, nomor baris telah banyak berubah seiring waktu. Saya juga di git 1.8.3 yang tidak mendukung regex di "git menyalahkan -L". (RHEL7 masih memiliki 1.8.3)
Oneliner:
Ini tentu saja dapat dibuat menjadi skrip atau fungsi.
sumber