Bagaimana saya bisa mendaftar semua komit yang mengubah file tertentu?


803

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


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).


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.

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

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

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.


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


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.


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

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>

8

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

git log --all -- '*.wmv'

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>

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.


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.


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.


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>".


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.