Bagaimana saya bisa mendaftar semua komit yang mengubah file tertentu?

803

Apakah ada cara untuk membuat daftar semua komit yang mengubah file tertentu?

Daniel
sumber
1
Apakah Anda mencari perubahan pada file di satu cabang; di semua cabang lokal; di semua cabang pada satu remote; atau di semua itu? Saya pikir di semua itu akan membutuhkan skrip.
benhorgen

Jawaban:

1083

The --followbekerja untuk file tertentu

git log --follow -- filename

Perbedaan dengan solusi lain yang diberikan

Perhatikan bahwa solusi lain termasuk git log path(tanpa --follow). Pendekatan itu berguna jika Anda ingin melacak mis perubahan dalam direktori , tetapi tersandung ketika file diubah namanya (dengan demikian gunakan --follow filename).

jackrabb1t
sumber
32
+1 --followakun untuk penggantian nama, jadi ini lebih kuat daripadagit log -- path
Gabe Moothart
42
Perhatikan bahwa --followmenerima jalur , yang bisa berupa file tetapi juga direktori. Dalam kasus yang terakhir ini akan berjalan secara rekursif dan melaporkan perubahan ke semua file di bawah titik itu. (Perilaku ini tidak didokumentasikan di halaman manual dan mungkin tidak permanen.)
StvnW
5
Apa perbedaan antara yang satu itu dan yang barugit log filename?
VaTo
8
@ SaulOrtega, git log filenametidak mengikuti penggantian nama file, artinya akan menampilkan semua commit terkait nama file itu (bukan file sebenarnya). Jika Anda membuat file Xdan Y, mengubah keduanya, lalu dihapus Ydan diubah namanya Xmenjadi Ydan kemudian juga diubah, dan Anda jalankan git log Y, Anda akan mendapatkan pesan untuk yang lama Y dan yang baru . Dan sebaliknya, dengan --followAnda akan mendapatkan komitmen mengenai file itu ketika dinamai X dan kapan dinamai Y.
MarSoft
7
gunakan "git log --all filename" untuk melihat semua komit di semua cabang
Lebnik
122

git log pathharus melakukan apa yang Anda inginkan. Dari git logpria itu :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.
Gabe Moothart
sumber
11
Tidak berfungsi jika jalur file telah berubah. Jawaban jackrabbit berhasil untuk kasus ini.
kwahn
1
Ini berfungsi jika Anda perlu membatasi log ke cabang tertentu
ams
63

Saya telah melihat ini dengan seksama dan semua jawaban ini tampaknya tidak benar-benar menunjukkan kepada saya semua komitmen di semua cabang.

Inilah yang saya dapatkan dengan bermain-main dengan opsi tampilan edit gitk. Ini menunjukkan saya semua komit untuk file terlepas dari cabang, lokal, reflog, dan jarak jauh.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

Ini juga bekerja dengan git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename
BigMiner
sumber
11
Ini sempurna untuk ketika seseorang membuat perubahan tetapi mereka lupa di mana mereka melakukan perubahan.
earthmeLon
2
Sangat berguna. Termasuk juga simpanan komit
Juan Antonio Tubío
Ini harus menjadi jawaban yang lebih disukai. Pertanyaannya adalah untuk menemukan semua komitmen, yang ini lakukan.
carl verbiest
Pemberitahuan yang --reflogmencakup komit yang diubah / diubah atau dibuang. Mungkin itu harus jelas, tetapi saya mencoba menggunakan ini git logdan mencoba mencari tahu mengapa saya melihat duplikat yang tampaknya dilakukan!
Soren Bjornstad
43

Gunakan perintah di bawah ini untuk mendapatkan komitmen untuk file tertentu:

git log -p filename
Sankar Subburaj
sumber
8
Saya mengerti bahwa ini tidak sepenuhnya menjawab pertanyaan karena dia ingin daftar komitmen tetapi ini adalah emas dan masuk ke file saya.
zkent
3
Ini tidak akan berfungsi sama sekali jika file tersebut tidak ada di cabang yang saat ini ditutup. Anda dapat menambahkan cabang suka git log -p mybranch -- filenameatau hanya gunakan git log --all -- filenameuntuk melihat di semua cabang.
Soren Bjornstad
37

Itu harus sesederhana git log <somepath>; periksa halaman manual ( git-log(1)).

Secara pribadi saya suka menggunakan git log --stat <path>sehingga saya bisa melihat dampak dari setiap komit pada file.

rfunduk
sumber
9
Atau bahkan -pjika Anda ingin melihat diff penuh, bukan hanya itu beberapa baris dimodifikasi.
Cascabel
Benar, tapi itu cukup berisik mengingat sebagian besar file telah diubah berkali-kali selama hidup mereka. Saya tidak ingin melihat perbedaan penuh dari setiap commit yang pernah menyentuh file. Saya biasanya mencari hal tertentu, jadi saya bisa mendapatkan log dengan dampak yang adil dan kemudian git showpada komitmen tertentu yang terlihat penting.
rfunduk
git log --stat --follow - * .html => daftar hasil komit dengan tepat satu file di setiap komit. Sangat bagus!
Sergio Belevskij
18

Atau (sejak Git 1.8.4), dimungkinkan juga untuk mendapatkan semua commit yang telah mengubah bagian tertentu dari file. Anda bisa mendapatkan ini dengan melewati garis awal dan nomor garis akhir.

Hasil yang dikembalikan adalah daftar commit yang memodifikasi bagian khusus ini. Perintahnya seperti:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

dimana upperLimitadalah start_line_numberdan lowerLimitadalahending_line_number

Info Lebih Lanjut - https://www.techpurohit.com/list-some-useful-git-commands

jitendrapurohit
sumber
17

Seperti yang ditunjukkan oleh jackrabb1t, --followlebih kuat karena terus mencatat sejarah di luar penggantian nama / gerakan. Jadi, jika Anda mencari file yang saat ini tidak di jalur yang sama atau file yang telah diubah namanya di berbagai komit, - ikuti akan melacaknya.

Ini bisa menjadi pilihan yang lebih baik jika Anda ingin memvisualisasikan perubahan nama / jalur:

git log --follow --name-status -- <path>

Tetapi jika Anda ingin daftar yang lebih ringkas dengan hanya yang penting:

git log --follow --name-status --format='%H' -- <path>

atau bahkan

git log --follow --name-only --format='%H' -- <path>

Kelemahannya adalah --followhanya berfungsi untuk satu file.

Roberto
sumber
4
--followberfungsi untuk satu jalur , yang bisa berupa direktori. Jika melewati direktori itu akan berjalan secara rekursif dan melaporkan perubahan ke semua file di bawah titik itu.
StvnW
10

Jika Anda mencoba - ikuti file yang dihapus dalam penggunaan komit sebelumnya

git log --follow -- filename
snovelli
sumber
3
Untuk gitpemula: Gunakan git log -p --follow -- filenameuntuk menampilkan perubahan juga. Perhatikan juga: "nama file" bisa berupa file, direktori atau submodule.
Tino
8

Jika Anda ingin melihat semua komit yang mengubah file, di semua cabang, gunakan ini:

git log --follow --all <filepath>
Selalu_Pemula
sumber
8

Jika Anda ingin mencari semua komitmen dengan filenamedan bukan oleh filepath , gunakan:

git log --all -- '*.wmv'
WonderLand
sumber
6

Jika Anda ingin melihat semua perubahan yang dilakukan dalam komit yang mengubah file tertentu (bukan hanya perubahan pada file itu sendiri), Anda dapat meneruskan --full-diff:

git log -p --full-diff [branch] -- <path>
Kubik
sumber
atau tanpa[branch]
Anentropic
1
@Anentropic Kurung kotak seharusnya menunjukkan bahwa argumen itu opsional.
Cubic
Itu semua yang saya butuhkan, itu menunjukkan perubahan penuh, termasuk beberapa perubahan dari penggabungan.
ThanhLD
5

Gunakan git log --all <filename>untuk melihat komit yang memengaruhi <filename>di semua cabang.

Lebnik
sumber
4
gitk <path_to_filename>

Dengan asumsi paket "gitk" sudah diinstal.

Jika tidak diinstal, lakukan ini:

sudo apt-get install gitk

Dan kemudian coba perintah di atas. Ini untuk Linux ... Mungkin membantu pengguna Linux jika mereka menginginkan GUI.

Breen ho
sumber
Untuk pengguna Windows, perhatikan bahwa gitkdibundel dengan Git untuk Windows.
Soren Bjornstad
2

Untuk mendapatkan daftar hash komit gunakan git rev-list

 git rev-list HEAD <filename>

Keluaran:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

yang berarti 5 komit telah menyentuh file ini. Ini urutan kronologis terbalik, jadi komit pertama dalam daftar b7c4f0d7adalah yang terbaru.

Boris
sumber
1

Di Linux Anda bisa menggunakan gitk untuk ini.

Ini dapat diinstal menggunakan "sudo apt-get install git-gui gitk". Itu dapat digunakan untuk melihat komit file tertentu dengan "gitk <Filename>".

Chamila Wijayarathna
sumber
1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

Referensi

AnshBikram
sumber