Halaman manual mengatakan bahwa log menunjukkan log komit dan reflog mengelola informasi reflog. Apa sebenarnya informasi reflog dan apa yang tidak dimiliki log? Log tampaknya jauh lebih terperinci.
sumber
Halaman manual mengatakan bahwa log menunjukkan log komit dan reflog mengelola informasi reflog. Apa sebenarnya informasi reflog dan apa yang tidak dimiliki log? Log tampaknya jauh lebih terperinci.
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 barisnew_rev
mungkin tidak cocok dengan yang berikutnyaold_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
: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 samagit log
, tetapi tidak harus samagit reflog
.sumber
Berikut penjelasan
reflog
dari buku Pro Git :The
reflog
perintah juga dapat digunakan untuk menghapus entri atau berakhir entri dari reflog yang terlalu tua. Dari dokumentasi Linux Kernel Git resmi untukreflog
:sumber
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, ketikgit 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 menggunakangit checkout
dan menjalankangit reflog
setelah setiap checkout. Anda akan melihat entri teratas diperbarui setiap kali sebagai entri "checkout". Anda tidak melihat entri jenis ini digit log
.Referensi: http://www.lornajane.net/posts/2014/git-log-all-branches
sumber
Saya suka menganggap perbedaan antara git log dan reflog sebagai perbedaan antara catatan pribadi dan catatan publik.
Pribadi vs 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.
Log dipoles. Reflog adalah singkat.
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:
Kembali ke ide 'jaring pengaman'
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.
sumber
Sebenarnya, reflog adalah alias untuk
jadi jawabannya harus: ini adalah kasus khusus.
sumber
git log
,-g
adalah bentuk pendek untuk--walk-reflogs
. Jadi, itu tidak menjelaskan apa pun.