git - Temukan komit tempat file ditambahkan

208

Katakanlah saya punya file foo.jsyang dilakukan beberapa waktu lalu. Saya hanya ingin mencari komit tempat file ini pertama kali ditambahkan.

Setelah membaca jawaban dan mengutak-atik saya sendiri, ini bekerja untuk saya

git log --follow --diff-filter=A --find-renames=40% foo.js
Steven Penny
sumber

Jawaban:

318

Inilah cara yang lebih sederhana, "pure Git" untuk melakukannya, tanpa perlu saluran pipa:

git log --diff-filter=A -- foo.js

Periksa dokumentasinya. Anda dapat melakukan hal yang sama untuk Dihapus, Dimodifikasi, dll.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

Saya memiliki alias praktis untuk ini, karena saya selalu lupa:

git config --global alias.whatadded 'log --diff-filter=A'

Ini membuatnya sesederhana:

git whatadded -- foo.js

Di bawah ini satu liner akan secara rekursif mencari melalui sub direktori $PWDuntuk foo.jstanpa harus menyediakan dan absolut atau relatif jalur ke file, juga tidak perlu file berada di direktori yang sama dengan$PWD

git log --diff-filter=A -- **foo.js
stelterd
sumber
27
+1! Namun, file saya berada di subfolder, jadi hanya berfungsi setelah saya menambahkan tanda bintang di depangit log --diff-filter=A -- *subfolder/foo.js
Geo
4
Bagaimana cara kerjanya pada file yang digabungkan dari cabang lain, tetapi yang tidak perlu ditambahkan ke cabang yang digabungkan oleh pengguna yang melakukan penggabungan?
g33kz0r
Tautan dokumen di atas tidak melompat ke info bendera. Mungkin sudah berubah sejak diposting. git-scm.com/docs/git-log#Documentation/…
webbower
1
Yap, mereka mengubah struktur jangkar di dokumen. Diperbarui, terima kasih!
stelterd
@geo saya pikir saya mendapatkan apa yang Anda katakan tetapi tidak benar-benar, tetapi saya memiliki kasus penggunaan yang sama, di mana saya umumnya tetap dalam proyek root dari direktori git dan mengeluarkan perintah dari sana, dan menggunakan yang disediakan satu liner git log --diff-filter=A -- foo.jstidak mencetak melakukan ID / hash ke STDOUT di terminal saya dan saya harus memberikan path relatif ke file dari git repo root untuk mendapatkan hasil yang diinginkan
ipatch
17
git log --oneline -- foo.js | tail -n 1
Seth Robertson
sumber
1
Saya akan senang memilikinya --follow.
Yasushi Shoji
Solusi yang diterima tidak bekerja untuk saya, tetapi ini berhasil. Terima kasih!
Stevie Howard
1

Berikut ini mungkin bukan minat Anda, tetapi saya pikir ini akan membantu Anda di masa depan dan merupakan bagian dari ekosistem debug di Git:

Anda dapat menggunakan git-blameuntuk menunjukkan revisi apa dan penulis terakhir memodifikasi setiap baris file, terutama penjelasan file. Kunjungi https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Sebagai contoh,

git blame -L 174,190  xx.py
Permintaan maaf
sumber
Bisakah Anda jelaskan apa yang dilakukan masing-masing operan? Saya menyadari Anda telah memberikan tautan ke rtfm yang relevan, tetapi sedikit penjelasan akan membuat posting Anda menjadi toko serba ada.
rossmcm
Seperti yang dikatakan buku Pro-Git Jika Anda melacak bug dalam kode Anda dan ingin tahu kapan itu diperkenalkan dan mengapa, anotasi file sering kali merupakan alat terbaik Anda. Ini menunjukkan kepada Anda apa yang komit adalah yang terakhir untuk memodifikasi setiap baris dari file apa pun, jadi contoh ini yang saya perlihatkan menggunakan opsi -L untuk membatasi output ke baris 174 hingga 190 dan yang terakhir hanyalah file target yang ingin Anda periksa ( xx.py) dalam hal ini file python @rossmcm
Reidel