git blame
bagus untuk baris yang dimodifikasi dan ditambahkan, tetapi bagaimana saya bisa menemukan ketika garis yang ada di komit sebelumnya tertentu akhirnya dihapus. Aku sedang berpikir bisect
, tapi aku berharap sesuatu yang lebih baik.
(Sebelum Anda bertanya: dalam hal ini, saya baru saja melakukan git log -p
dan mencari-cari baris kode dan (a) beberapa idiot baru saja menghapus garis vital pada komit sebelumnya dan (b) saya idiot itu.)
git log -S<string> /path/to/file
ingin-c
atau-cc
juga menunjukkan penghapusan selama penggabungan (konflik)-c
dan--cc
. @Steen: Benar, terima kasih telah menunjukkan! Pengawasan yang bodoh. Seandainya saya bisa mengedit komentar. Menambahkan yang baru, lalu menghapus milikku, maka kamu menghapus milikmu terlalu rumit kurasa :)git blame
memiliki opsi untuk menampilkan baris yang dihapus (dengan mungkin dicoret atau teks merah) dengan revisi di mana mereka dihapus.Jawaban:
Jika Anda tahu konten baris, ini adalah kasus penggunaan yang ideal untuk:
yang menunjukkan Anda melakukan yang memperkenalkan atau menghapus instance string itu. Ada juga
-G<regex>
yang melakukan hal yang sama dengan ekspresi reguler! Lihatman git-log
dan cari opsi-G
dan-S
, atau beliung (nama yang ramah untuk fitur ini) untuk informasi lebih lanjut.The
-S
pilihan sebenarnya disebutkan dalam header darigit-blame
manualnya juga, di bagian description, di mana ia memberi contoh dengan menggunakangit log -S...
.sumber
git blame --reverse
Metode menemukan itu.)-c
opsi tambahan.Saya pikir apa yang Anda inginkan sebenarnya
Dari halaman manual :
Dengan
git blame reverse
, Anda dapat menemukan komit terakhir di mana baris tersebut muncul. Anda masih perlu mendapatkan komit yang muncul setelahnya.Anda dapat menggunakan perintah berikut untuk menampilkan log git terbalik. Komit pertama yang diperlihatkan akan menjadi yang terakhir kali baris tersebut muncul, dan komit berikutnya adalah ketika diubah atau dihapus.
sumber
git blame --reverse
akan menampilkan revisi sebelum penggabungan yang secara kronologis terakhir, bukan revisi sebelum penggabungan awal di mana keputusan dibuat untuk tidak mengambil garis. Apakah ada cara untuk menemukan revisi paling awal di mana garis berhenti ada daripada yang terbaru?Hanya untuk melengkapi jawaban Cascabel :
Saya memiliki masalah yang sama dengan yang disebutkan di sini, tetapi ternyata garis itu hilang, karena komit gabungan dari cabang dikembalikan dan kemudian bergabung kembali ke dalamnya, secara efektif menghilangkan garis yang dipertanyakan. The
--full-history
mencegah bendera melewatkan mereka komit.sumber
git menyalahkan --reverse dapat membuat Anda dekat dengan tempat garis dihapus. Tetapi sebenarnya tidak menunjuk ke revisi di mana garis dihapus. Ini menunjuk ke revisi terakhir di mana garis itu ada . Kemudian jika revisi berikut ini adalah komit sederhana, Anda beruntung dan Anda mendapat revisi penghapusan. OTOH, jika revisi berikut adalah gabungan komit , maka semuanya bisa menjadi sedikit liar.
Sebagai bagian dari upaya membuat difflame, saya menangani masalah ini jadi jika Anda sudah menginstal Python di komputer Anda dan Anda bersedia mencobanya, maka jangan menunggu lagi dan biarkan saya tahu bagaimana hasilnya.
https://github.com/eantoranz/difflame
sumber
Untuk perubahan yang disembunyikan dalam gabungan komitmen
Menggabungkan komit secara otomatis menyembunyikan perubahannya dari output log Git. Baik beliung dan sebaliknya-menyalahkan tidak menemukan perubahan. Jadi baris yang saya inginkan telah ditambahkan dan kemudian dihapus dan saya ingin menemukan gabungan yang menghapusnya.
git log -p -- path/file
Riwayat file hanya menunjukkan itu ditambahkan. Inilah cara terbaik yang saya temukan untuk menemukannya:git log -p -U9999 -- path/file
Cari perubahannya, lalu cari mundur untuk "^ commit" - yang pertama "^ commit" adalah komit di mana file terakhir memiliki baris itu. "^ Commit" kedua adalah setelah menghilang. Komit kedua mungkin adalah yang menghapusnya. Ini
-U9999
dimaksudkan untuk menampilkan seluruh isi file (setelah setiap kali file diubah), dengan asumsi file Anda semuanya maks 9999 baris.Menemukan gabungan yang terkait melalui brute force (bedakan setiap kemungkinan gabungan komit dengan induk pertamanya, jalankan terhadap ton komit)
git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less
(Saya mencoba membatasi filter revisi lebih banyak, tetapi saya mengalami masalah dan tidak merekomendasikan ini. Perubahan penambahan / penghapusan yang saya cari ada di cabang berbeda yang digabung pada waktu yang berbeda dan A ... B tidak termasuk ketika perubahan benar-benar digabungkan ke dalam arus utama.)
Perlihatkan pohon Git dengan dua komit ini (dan banyak riwayat kompleks Git dihapus):
git log --graph --oneline A B ^$(git merge-base A B)
(A adalah komit pertama di atas, B adalah komit kedua di atas)Tampilkan riwayat A dan riwayat B minus sejarah A dan B.
Versi alternatif (tampaknya menunjukkan jalur lebih linier daripada pohon riwayat Git biasa - namun saya lebih suka pohon riwayat git biasa):
Tiga, bukan dua titik - tiga titik berarti "r1 r2 - tidak $ (git merge-base --all r1 r2). Ini adalah himpunan komit yang dapat dijangkau dari salah satu dari r1 (sisi kiri) atau r2 (kanan sisi), tetapi tidak dari keduanya. " - sumber: "man gitrevisions"
sumber