Git mencari string dalam riwayat satu file

172

Jadi jika saya memiliki file bernama foo.rb dan itu memberi saya kesalahan untuk metode yang disebut bar , jadi saya ingin mencari sejarah foo.rb untuk string baruntuk melihat apakah pernah didefinisikan di masa lalu.

Saya menemukan ini Cari semua riwayat Git untuk sebuah string?

Tapi ini mencari semua file. Saya hanya ingin mencari dalam satu file.

JD Isaacks
sumber
6
Sama seperti FYI, Anda dapat menambahkan -- filenameke banyak perintah git jika Anda ingin membatasi ke satu file.
Karl Bielefeldt

Jawaban:

234

Untuk tujuan ini, Anda dapat menggunakan opsi -S untuk mendapatkan log:

git log -S'bar' -- foo.rb
ralphtheninja
sumber
39
Atau git log -G'bar' -- foo.rbuntuk mencari diff yang berisi 'bilah' daripada komit yang mengubah jumlah kemunculan 'bilah' (lihat manual git-log).
Jakub Narębski
1
Itu tidak bekerja untuk saya dengan tanda kutip, saya harus menggunakannya -Sbaruntuk mencari bar . Mungkin ada hubungannya dengan saya menggunakan baris perintah Windows.
zbr
dengan kata lain, -Gadalah untuk pencarian regex ... ini juga merupakan referensi yang bagus: stackoverflow.com/a/4472267/2586761
ptim
17

Atau mungkin Anda dapat mencoba yang ini (dari pertanyaan terkait Cari semua sejarah git untuk string )

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

Ini benar-benar akan mencari konten file dan tidak melakukan pesan / tambalan untuk setiap kejadian bar.

Antoine Pelisse
sumber
Untuk windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(perhatikan tanda kutip ganda jika nama file atau frasa pencarian memiliki spasi)
biscuit314
1
Bagi saya di Windows itu tidak berfungsi tanpa "do": for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (perhatikan tanda kutip ganda jika nama file atau frasa pencarian memiliki spasi)
xberger
2

Ada perintah override untuk git log (dari manual ):

$ git log Makefile      # commits that modify Makefile

Jadi Anda bisa menggunakan:

git log foo.rb | grep "bar"
Dmitry Reznik
sumber
2
Terima kasih, tetapi ini hanya mencari histori komit, bukan riwayat sumber file.
JD Isaacks
2
Sebenarnya ada penggantian lain yang mencari perubahan data string: git log -S'foo () '# commit yang menambah atau menghapus data file apa pun yang cocok dengan string' foo () '
Dmitry Reznik
1
Anda juga dapat mencoba menggunakan parameter --full-diff. Log tidak hanya menampilkan histori commit, tetapi juga diffs.
Dmitry Reznik
@DmitriyReznik - tampaknya --full-difftidak berfungsi (seperti pada, tidak ada perbedaan ditampilkan) tanpa -p, setidaknya pada git 1.7.9.5
sdaau
0

Saya menggunakan git log -S "string" --follow -p "path of file"yang menunjukkan sejarah penuh dari semua perubahan dengan string itu.

susun pertanyaan
sumber