Jawaban:
git log
menunjukkan KEPALA saat ini dan leluhurnya. Yaitu, ia mencetak titik HEAD komit ke, lalu induknya, induknya, dan sebagainya. Itu melintasi kembali melalui keturunan repo, dengan secara rekursif mencari orang tua masing-masing komit.
(Dalam praktiknya, beberapa komit memiliki lebih dari satu orangtua. Untuk melihat log yang lebih representatif, gunakan perintah seperti git log --oneline --graph --decorate
.)
git reflog
sama sekali tidak melintasi nenek moyang HEAD. Reflog adalah daftar komit yang diatur oleh HEAD: itu membatalkan sejarah repo Anda. Reflog bukan bagian dari repo itu sendiri (itu disimpan secara terpisah untuk komit itu sendiri) dan tidak termasuk dalam dorongan, pengambilan atau klon; ini murni lokal.
Selain itu: memahami reflog berarti Anda tidak dapat benar-benar kehilangan data dari repo setelah dilakukan. Jika Anda secara tidak sengaja mengatur ulang ke komit yang lebih lama, atau melakukan rebase yang salah, atau operasi lain yang secara visual "menghilangkan" komit, Anda dapat menggunakan reflog untuk melihat di mana Anda sebelumnya dan git reset --hard
kembali ke ref itu untuk mengembalikan keadaan Anda sebelumnya. Ingat, referensi tidak hanya menunjukkan komitmen tetapi seluruh sejarah di baliknya.
.git/logs/refs/<branch>
entri memiliki format <old_rev> <new_rev> [...] <timestamp> [...]
. Anda dapat mencoba menggabungkan dan mengurutkan berdasarkan cap waktu. Namun, beberapa baris new_rev
mungkin tidak cocok dengan yang berikutnya old_rev
, dalam hal ini saya curiga reflog tidak valid. Anda kemudian dapat mencoba memasukkan entri palsu untuk "memperbaiki" urutan, tetapi tampaknya terlalu merepotkan bagi saya.
git log
menunjukkan log komit yang dapat diakses dari referensi (kepala, tag, remote)git reflog
adalah catatan dari semua komitmen yang direferensikan dalam repo Anda kapan saja.Itu sebabnya git reflog
( rekaman lokal yang dipangkas setelah 90 hari secara default) digunakan ketika Anda melakukan operasi "destruktif" (seperti menghapus cabang), untuk mendapatkan kembali SHA1 yang direferensikan oleh cabang itu.
Lihat git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
kedaluwarsa menghapus entri reflog yang lebih lama dari waktu ini; default ke 90 hari.
Dengan "<pattern>
" (mis. "refs/stash
") Di tengah pengaturan hanya berlaku untuk referensi yang cocok dengan<pattern>
.
git reflog
sering disebut sebagai " jaring pengaman Anda "
Jika ada masalah, saran umum, ketika git log tidak menunjukkan kepada Anda apa yang Anda cari, adalah:
Sekali lagi, reflog adalah rekaman lokal SHA1 Anda.
Berbeda dengan git log
: jika Anda mendorong repo Anda ke repo hulu , Anda akan melihat hal yang sama git log
, tetapi tidak harus sama git reflog
.
Berikut penjelasan reflog
dari buku Pro Git :
Salah satu hal yang dilakukan Git di latar belakang saat Anda sedang pergi bekerja adalah menyimpan reflog - log di mana HEAD dan referensi cabang Anda berada selama beberapa bulan terakhir.
Anda dapat melihat reflog Anda dengan menggunakan
git reflog
:$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
Setiap kali tip cabang Anda diperbarui dengan alasan apa pun, Git menyimpan informasi itu untuk Anda dalam sejarah sementara ini. Dan Anda dapat menentukan komitmen yang lebih lama dengan data ini, juga.
The reflog
perintah juga dapat digunakan untuk menghapus entri atau berakhir entri dari reflog yang terlalu tua. Dari dokumentasi Linux Kernel Git resmi untukreflog
:
Subperintah
expire
ini digunakan untuk memangkas entri reflog yang lebih lama.Untuk menghapus satu entri dari reflog, gunakan sub perintah
delete
dan tentukan entri yang tepat (misgit reflog delete master@{2}
.).
git log
memberi Anda informasi yang sama? Maaf jika tampaknya sudah jelas, saya sangat baru di GIT dan ingin mendapatkan beberapa dasar sebelum OMG pertama saya.
HEAD
), dan yang menunjukkan komitmen mereka. Apakah itu masuk akal? Di samping catatan, log
juga dapat menunjukkan Anda informasi reflog, tetapi Anda harus melewati bendera opsi khusus sebagai argumen untuk itu --walk-reflogs
,.
Saya ingin tahu tentang ini juga dan hanya ingin menguraikan dan meringkas sedikit:
git log
memperlihatkan riwayat semua komitmen Anda untuk cabang tempat Anda berada. Periksa cabang yang berbeda dan Anda akan melihat riwayat komit yang berbeda. Jika Anda ingin melihat Anda komit riwayat untuk semua cabang, ketik git log --all
.
git reflog
menunjukkan catatan referensi Anda seperti kata Cupcake. Ada entri setiap kali komit atau checkout dilakukan. Coba bolak-balik antara dua cabang beberapa kali menggunakan git checkout
dan menjalankan git reflog
setelah setiap checkout. Anda akan melihat entri teratas diperbarui setiap kali sebagai entri "checkout". Anda tidak melihat entri jenis ini di git log
.
Referensi: http://www.lornajane.net/posts/2014/git-log-all-branches
Saya suka menganggap perbedaan antara git log dan reflog sebagai perbedaan antara catatan pribadi dan catatan publik.
Dengan reflog git, ia melacak semua yang telah Anda lakukan secara lokal. Apakah Anda berkomitmen? Reflog melacaknya. Apakah Anda melakukan hard reset? Reflog melacaknya. Apakah Anda mengubah komit ? Reflog melacaknya. Semua yang Anda lakukan secara lokal, ada entri untuk itu di reflog.
Ini tidak berlaku untuk log. Jika Anda mengubah komit, log hanya menunjukkan komit baru. Jika Anda melakukan reset dan melewatkan beberapa commit dalam riwayat Anda, commit yang Anda lewatkan tidak akan muncul di log. Saat Anda mendorong perubahan ke pengembang lain atau ke GitHub atau semacamnya, hanya konten yang dilacak dalam log yang akan muncul. Untuk pengembang lain, itu akan terlihat seperti pengaturan ulang tidak pernah terjadi atau perubahan tidak pernah terjadi.
Jadi ya, saya suka analogi 'privat vs publik'. Atau mungkin log vs reflog yang lebih baik analogi adalah 'dipoles vs singkat.' Reflog menunjukkan semua cobaan dan kesalahan Anda. Log hanya menunjukkan versi bersih dan terpoles dari riwayat pekerjaan Anda.
Lihatlah gambar ini untuk menekankan poinnya. Sejumlah perubahan dan pengaturan ulang telah terjadi sejak repositori diinisialisasi. Reflog menunjukkan semuanya. Namun perintah log membuatnya seolah-olah hanya ada satu komit terhadap repo:
Juga, karena reflog melacak hal-hal yang Anda ubah dan melakukan reset , memungkinkan Anda untuk kembali dan menemukan komitmen karena itu akan memberi Anda id komitmen. Dengan asumsi repositori Anda belum dibersihkan dari komit lama, yang memungkinkan Anda untuk menghidupkan kembali item yang tidak lagi terlihat di log. Begitulah reflog kadang-kadang berakhir menyelamatkan kulit seseorang ketika mereka perlu mendapatkan kembali sesuatu yang mereka pikir mereka kehilangan secara tidak sengaja.
Sebenarnya, reflog adalah alias untuk
git log -g --abbrev-commit --pretty=oneline
jadi jawabannya harus: ini adalah kasus khusus.
git log
, -g
adalah bentuk pendek untuk --walk-reflogs
. Jadi, itu tidak menjelaskan apa pun.