Saya telah menghapus file atau beberapa kode dalam suatu file di masa lalu. Bisakah saya memahami konten (bukan dalam pesan komit)?
Solusi yang sangat buruk adalah dengan mengambil log:
git log -p | grep <pattern>
Namun, ini tidak mengembalikan hash komit langsung. Saya bermain-main dengan git grep
tidak berhasil.
git log -S
dan kesalahan) * [Bersenang-senang dengan "git log --grep"] [2] (mencari pesan komit ) * [Bersenang-senang dengan "git grep"] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.htmlJawaban:
Untuk mencari konten komit (yaitu, baris sumber aktual, sebagai lawan dari komit pesan dan sejenisnya), Anda perlu melakukan:
git rev-list --all | xargs git grep <expression>
akan berfungsi jika Anda mengalami kesalahan "Daftar argumen terlalu panjang".Jika Anda ingin membatasi pencarian hingga beberapa subtree (misalnya, "lib / util"), Anda harus meneruskannya ke
rev-list
subkomand dangrep
juga:Ini akan mencakup semua teks komit Anda untuk
regexp
.Alasan untuk melewati jalan di kedua perintah adalah karena
rev-list
akan mengembalikan daftar revisi tempat semua perubahanlib/util
terjadi, tetapi Anda juga harus meneruskan kegrep
sehingga hanya akan mencarilib/util
.Bayangkan saja skenario berikut ini:
grep
mungkin menemukan hal yang sama<regexp>
pada file lain yang terkandung dalam revisi yang sama dikembalikan olehrev-list
(bahkan jika tidak ada perubahan pada file pada revisi itu).Berikut ini beberapa cara lain yang berguna untuk mencari sumber Anda:
Telusuri pohon kerja untuk pencocokan teks regexp ekspresi reguler:
Telusuri pohon kerja untuk baris teks yang cocok dengan ekspresi reguler regexp1 atau regexp2:
Telusuri bagan yang berfungsi untuk baris teks yang cocok dengan ekspresi reguler regexp1 dan regexp2, hanya melaporkan jalur file:
Cari pohon yang berfungsi untuk file yang memiliki baris teks yang cocok dengan ekspresi reguler regexp1 dan baris teks yang cocok dengan ekspresi reguler regexp2:
Telusuri pohon kerja untuk perubahan garis pola pencocokan teks:
Cari semua revisi untuk pencocokan teks reguler regexp ekspresi:
Cari semua revisi antara rev1 dan rev2 untuk teks yang cocok dengan regexp ekspresi reguler:
sumber
sh.exe": /bin/git: Bad file number
. Jawaban VonC juga berfungsi dengan msysgit.git gc
atau periksa: stackoverflow.com/questions/1507463/…Anda harus menggunakan opsi beliung (
-S
) darigit log
.Untuk mencari
Foo
:Lihat Riwayat Git - temukan baris yang hilang berdasarkan kata kunci untuk lebih banyak.
Seperti yang Jakub Narębski berkomentar:
ini mencari perbedaan yang memperkenalkan atau menghapus instance dari
<string>
. Biasanya berarti "revisi di mana Anda menambahkan atau menghapus baris dengan 'Foo'".yang
--pickaxe-regex
memungkinkan anda untuk menggunakan diperpanjang POSIX regex bukan mencari string. Contoh (darigit log
):git log -S"frotz\(nitfol" --pickaxe-regex
Seperti yang dikomentari Rob , pencarian ini peka terhadap huruf besar-kecil - ia membuka pertanyaan lanjutan tentang bagaimana mencari tidak peka huruf besar-kecil.
sumber
git log
sedikit dalam pertanyaan Anda telah saya bingung;)-p
flag untuk juga mengeluarkan diff.--branches --all
opsi untuk mencari semua repo.Cara favorit saya untuk melakukannya adalah dengan
git log
's-G
pilihan (ditambahkan pada versi 1.7.4).Ada perbedaan tipis antara cara
-G
dan-S
opsi menentukan apakah komit cocok:-S
pilihan dasarnya menghitung jumlah kali pertandingan pencarian Anda dalam file sebelum dan setelah komit. Komit ditampilkan dalam log jika jumlah sebelum dan sesudah berbeda. Ini tidak akan, misalnya, menunjukkan komit di mana baris yang cocok dengan pencarian Anda dipindahkan.-G
opsi tersebut, komit ditampilkan dalam log jika pencarian Anda cocok dengan baris apa pun yang ditambahkan, dihapus, atau diubah.Ambil komit ini sebagai contoh:
Karena berapa kali "halo" muncul dalam file adalah sama sebelum dan setelah komit ini, itu tidak akan cocok dengan menggunakan
-Shello
. Namun, karena ada perubahan pada pencocokan garishello
, komit akan ditampilkan menggunakan-Ghello
.sumber
-p
opsi untuk menampilkan diff untuk setiap commit. Kemudian ketika log dibuka di pager saya, saya mencari apa pun yang saya cari. Jika pagerless
Anda dan Andagit log -Ghello -p
, Anda dapat mengetik/hello
, tekanEnter
, dan gunakann
danN
untuk menemukan "hello" kejadian berikutnya / sebelumnya.-G
dan Regex: Jika baris perintah menggunakan UTF-8 dan file yang Anda lihat menggunakan beberapa pengkodean ISO-Latin (8 bit),.*
gagal. Misalnya, saya punya perubahanVierter Entwurf
->Fünfter Entwurf
, dan saat'V.*ter Entwurf'
menghasilkan kecocokan,'F.*ter Entwurf'
tidak.Jika Anda ingin menelusuri perubahan kode (lihat apa yang sebenarnya telah diubah dengan kata yang diberikan di seluruh riwayat) gunakan
patch
mode - Saya menemukan kombinasi yang sangat berguna untuk melakukan:sumber
git log
bisa menjadi cara yang lebih efektif untuk mencari teks di semua cabang, terutama jika ada banyak kecocokan, dan Anda ingin melihat perubahan yang lebih baru (relevan) terlebih dahulu.Daftar perintah log ini berkomitmen untuk menambah atau menghapus string pencarian / regex yang diberikan, (umumnya) lebih baru terlebih dahulu. The
-p
pilihan menyebabkan diff relevan untuk ditampilkan di mana pola ditambahkan atau dihapus, sehingga Anda dapat melihatnya dalam konteks.Setelah menemukan komit yang relevan yang menambahkan teks yang Anda cari (misalnya, 8beeff00d), temukan cabang yang berisi komit:
sumber
'
kutipan tidak mengelompokkan string pencarian Anda menjadi satu argumen. Sebaliknya,'public
adalah argumen untuk-S
, dan itu memperlakukan sisanya sebagai argumen terpisah. Saya tidak yakin lingkungan apa yang Anda jalankan, tetapi konteks itu diperlukan untuk membantu memecahkan masalah. Saya sarankan membuka pertanyaan StackOverflow terpisah jika diperlukan untuk membantu Anda memecahkan masalah, dengan semua konteks tentang bagaimana perintah git Anda dikirim ke shell. Sepertinya saya dikirim melalui perintah lain? Komentar di sini bukan tempat yang tepat untuk mencari tahu hal ini.Saya mengambil jawaban Jeet dan mengadaptasinya ke Windows (terima kasih atas jawaban ini ):
Perhatikan bahwa bagi saya, untuk beberapa alasan, komit aktual yang menghapus regex ini tidak muncul di output perintah, melainkan komit sebelumnya.
sumber
--no-pager
ke perintah git di akhir>>results.txt
untuk mereka yang tidak berpengalaman dalam Windows piping ...Cari dalam revisi apa pun, file apa pun :
Cari hanya di beberapa file yang diberikan, misalnya file XML:
Baris hasil akan terlihat seperti ini: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: teks dari baris yang ditemukan ...
Anda kemudian dapat memperoleh informasi lebih lanjut seperti penulis, tanggal, dan beda menggunakan
git show
:sumber
Untuk kesederhanaan, saya sarankan menggunakan GUI: gitk - Peramban repositori Git . Cukup fleksibel
Dan Anda dapat menavigasi hasil menggunakan panah atas / bawah.
sumber
Bagi siapa pun yang mencoba melakukan ini di Sourcetree , tidak ada perintah langsung di UI untuk itu (pada versi 1.6.21.0). Namun, Anda dapat menggunakan perintah yang ditentukan dalam jawaban yang diterima dengan membuka jendela Terminal (tombol yang tersedia di bilah alat utama) dan menyalin / menempelkannya di sana.
Catatan: Tampilan Pencarian Sourcetree sebagian dapat melakukan pencarian teks untuk Anda. Tekan Ctrl+ 3untuk pergi ke tampilan Pencarian (atau klik tab Cari yang tersedia di bagian bawah). Dari paling kanan, atur jenis Pencarian ke Perubahan File dan kemudian ketik string yang ingin Anda cari. Metode ini memiliki batasan berikut dibandingkan dengan perintah di atas:
sumber
Setiap kali saya menemukan diri saya di tempat Anda, saya menggunakan baris perintah berikut:
Penjelasan:
git log
- Perlu saya tulis lebih banyak di sini; itu menunjukkan log dalam urutan kronologis.-S "<words/phrases i am trying to find>"
- Ini menunjukkan semua komit Git di mana file apa pun (ditambahkan / diubah / dihapus) memiliki kata / frasa yang saya coba temukan tanpa simbol '<>'.--all
- Untuk menegakkan dan mencari di semua cabang.--oneline
- Ini memampatkan Git log dalam satu baris.--graph
- Ini menciptakan grafik komit yang dipesan secara kronologis.sumber
Jawaban Jeet bekerja di PowerShell.
Berikut ini menampilkan semua file, dalam komit apa pun, yang berisi a
password
.sumber
Jadi, apakah Anda mencoba membaca versi kode yang lebih lama untuk melihat di mana ada sesuatu yang terakhir?
Jika saya melakukan ini, saya mungkin akan menggunakan git bisect . Dengan menggunakan dua bagian, Anda dapat menentukan versi yang dikenal baik, versi buruk yang diketahui, dan skrip sederhana yang melakukan pemeriksaan untuk melihat apakah versi tersebut baik atau buruk (dalam hal ini grep untuk melihat apakah kode yang Anda cari ada. ). Menjalankan ini akan menemukan ketika kode itu dihapus.
sumber
Skenario: Anda melakukan pembersihan besar-besaran terhadap kode Anda dengan menggunakan IDE Anda. Masalah: IDE membersihkan lebih dari yang seharusnya dan sekarang kode Anda tidak dikompilasi (sumber daya hilang, dll.)
Larutan:
Ini akan menemukan file tempat "text_to_find" diubah.
Anda sekarang dapat membatalkan perubahan ini dan mengkompilasi kode Anda.
sumber
adalah tweak untuk solusi Jeet , jadi ini menunjukkan hasil saat pencarian dan bukan hanya di akhir (yang bisa memakan waktu lama dalam repositori besar).
sumber
Dalam kasus saya, saya perlu mencari komit pendek dan sayangnya solusi yang tercantum tidak berfungsi.
Saya berhasil melakukannya dengan (ganti token REGEX ):
sumber