Saya ingin dapat menemukan string tertentu yang diperkenalkan di komit apa pun di cabang mana pun, bagaimana saya bisa melakukannya? Saya menemukan sesuatu (yang saya modifikasi untuk Win32), tetapi git whatchanged
tampaknya tidak melihat ke cabang yang berbeda (abaikan potongan py3k, itu hanya perbaikan feed baris msys / win)
git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>
Tidak masalah jika solusi Anda lambat.
Jawaban:
Anda dapat melakukan:
Untuk menemukan semua komit yang menambahkan atau menghapus string tetap
whatever
. The--all
berarti parameter untuk memulai dari setiap cabang dan--source
sarana untuk menunjukkan mana yang cabang menyebabkan temuan bahwa komit. Sering berguna untuk menambahkan-p
untuk menunjukkan patch yang masing-masing berkomitmen akan memperkenalkan juga.Versi git sejak 1.7.4 juga memiliki
-G
opsi serupa , yang mengambil ekspresi reguler . Ini sebenarnya memiliki semantik yang berbeda (dan lebih jelas), dijelaskan dalam posting blog ini dari Junio Hamano .Seperti yang ditunjukkan thameera dalam komentar, Anda perlu memberi tanda kutip di sekitar istilah pencarian jika mengandung spasi atau karakter khusus lainnya, misalnya:
Berikut ini contoh yang digunakan
-G
untuk menemukan kejadianfunction foo() {
:sumber
--decorate
hanya menambahkan nama cabang ke komit di ujung setiap cabang. Dalam praktiknya saya tidak benar-benar menggunakan--source
atau--decorate
, dan alih-alih menggunakangit branch -a --contains <commit-hash>
untuk menemukan cabang mana yang berisi komit yang saya minati.git log -S"dude, where's my car?" --source --all
,. @ribamar juga menulis itu dalam jawaban di bawah, tetapi mungkin dengan mudah diabaikan di samping jawaban teratas ini.--reverse juga membantu karena Anda ingin komit pertama yang membuat perubahan:
Dengan cara ini, komitmen yang lebih lama akan muncul lebih dulu.
sumber
Jawaban Mark Longair sangat bagus, tetapi saya telah menemukan versi yang lebih sederhana ini bekerja untuk saya.
sumber
HEAD
, tetapi pertanyaan khusus ini bertanya secara khusus tentang melihat semua cabang dalam repositori.Bercak dengan jawaban yang sama:
Sekarang kamu bisa melakukannya
atau
sumber
Perhatikan untuk tidak menggunakan spasi antara S dan "string_to_search". Dalam beberapa pengaturan (git 1.7.1), Anda akan mendapatkan kesalahan seperti:
sumber
Meskipun ini tidak langsung menjawab pertanyaan Anda, saya pikir itu mungkin solusi yang baik untuk Anda di masa depan. Saya melihat bagian dari kode saya, yang buruk. Tidak tahu siapa yang menulisnya atau kapan. Saya dapat melihat semua perubahan dari file, tetapi jelas bahwa kode telah dipindahkan dari beberapa file lain ke yang ini. Saya ingin menemukan siapa yang sebenarnya menambahkannya di tempat pertama.
Untuk melakukan ini, saya menggunakan Git bisect , yang dengan cepat membiarkan saya menemukan orang berdosa.
Saya berlari
git bisect start
dan kemudiangit bisect bad
, karena revisi diperiksa memiliki masalah. Karena saya tidak tahu kapan masalah terjadi, saya menargetkan komit pertama untuk "baik"git bisect good <initial sha>
,.Kemudian saya terus mencari repo untuk kode yang buruk. Ketika saya menemukannya, aku berlari
git bisect bad
, dan ketika itu tidak ada:git bisect good
.Dalam ~ 11 langkah, saya telah membahas ~ 1000 komitmen dan menemukan komit yang tepat, di mana masalah tersebut diperkenalkan. Cukup bagus.
sumber
Tidak yakin mengapa jawaban yang diterima tidak bekerja di lingkungan saya, akhirnya saya menjalankan perintah di bawah ini untuk mendapatkan yang saya butuhkan
sumber