reflog: Penyelamat Saat Panik
Menyelamatkan commit yang hilang akibat reset --hard atau branch terhapus.
Jaring pengaman TERAKHIR yang jarang diketahui
Semua perintah "berbahaya" di Git (reset --hard, branch -D, rebase yang gagal) punya satu kesamaan: mereka tidak benar-benar menghapus data saat itu juga. Mereka cuma memindahkan pointer. Datanya masih duduk manis di database Git. Dan git reflog adalah peta menuju data itu.
Reflog mencatat SETIAP pergerakan HEAD di repo lokalmu: commit, reset, checkout, merge, rebase, bahkan branch yang dihapus. Anggap saja CCTV 90 hari terakhir (retensi default). Saat semua cara normal gagal dan kamu panik "commit-ku hilang!", reflog adalah tempat pertama, dan biasanya terakhir, yang perlu kamu datangi.
Contoh 1: membaca jejak reflog
git refloga1b2c3d (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2
e4f5a6b HEAD@{1}: commit: Tambah fitur penting
d7c8e9f HEAD@{2}: commit: WIP jangan sampai hilang
b3c4d5e HEAD@{3}: checkout: moving from fitur to main
Baca dari bawah ke atas: pindah dari branch fitur ke main, commit dua kali, lalu reset mundur 2 commit. HEAD@{n} artinya "nilai HEAD n langkah lalu"; HEAD@{1} adalah posisi sebelum reset, tempat dua commit penting itu masih hidup.
Reflog juga berguna untuk non-darurat. Mau tahu "apa yang berubah sejak langkah terakhirku?":
git diff HEAD@{1} HEAD --statContoh 2: penyelamatan reset --hard yang kebablasan
Skenario klasik. Kamu menjalankan ini:
git reset --hard HEAD~2Lalu 10 detik kemudian sadar: dua commit itu PENTING, belum di-push ke mana-mana. Jantung berdebar. Tenang, ini urutan penyelamatannya:
git refloga1b2c3d (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2
e4f5a6b HEAD@{1}: commit: Tambah fitur penting
d7c8e9f HEAD@{2}: commit: WIP jangan sampai hilang
Ketemu: commit yang hilang adalah e4f5a6b. Kembalikan pointer ke sana:
git reset --hard e4f5a6bHEAD is now at e4f5a6b Tambah fitur penting
Selesai. Dua commit kembali seperti tidak pernah hilang. Cara lebih singkatnya: git reset --hard HEAD@{1}, langsung pakai sintaks reflog tanpa perlu mencatat hash.
Contoh 3: menghidupkan branch yang terhapus
git branch -D fitur-pentingAduh. Branch-nya belum di-merge, dan kamu pakai -D (force) lagi. Tapi ingat: branch hanyalah sticky note. Commit-nya masih ada di database sampai garbage collector membersihkannya (sekitar 90 hari untuk entri reflog).
git reflog | head -5a1b2c3d (HEAD -> main) HEAD@{0}: checkout: moving from fitur-penting to main
f9e8d7c HEAD@{1}: commit: Hampir selesai, jangan hapus!
HEAD@{1} adalah commit terakhir branch yang terhapus. Buat branch baru tepat di sana:
git switch -c fitur-penting f9e8d7cSwitched to a new branch 'fitur-penting'
Branch hidup lagi, lengkap dengan semua commit-nya.
Batasan penting (jaring ini tidak sempurna)
- Reflog hanya ada di lokal, tidak ikut di-push. Ia tidak bisa menyelamatkan repo orang lain atau laptop yang sudah diformat.
- Kalau folder
.git-nya ikut terhapus, reflog ikut hilang. Backup tetap perlu untuk bencana level itu. - Setelah 90 hari (default), entri kedaluwarsa dibersihkan garbage collector. Jangan menunda penyelamatan.
Kesalahan umum pemula
SALAH: panik lalu menjalankan perintah Git lain yang menulis riwayat.
git reset --hard HEAD~2 # aduh salah!
git commit -m "coba benerin" # MALAH MENAMBAH JEJAK BARU
git rebase main # makin kacauSetiap perintah baru menggeser posisi reflog dan menumpuk jejak, bikin pencarian commit yang hilang makin sulit. Ini kesalahan paling mahal dalam situasi darurat.
BENAR: BEKU. Jangan sentuh apa-apa, langsung buka reflog.
Urutan darurat yang wajib dihafal: (1) JANGAN jalankan perintah Git lain yang menulis riwayat, (2) git reflog, (3) temukan hash yang hilang, (4) git reset --hard <hash> atau buat branch dari hash itu. Hampir tidak ada kehilangan data Git yang tidak bisa diselamatkan reflog selama folder .git masih utuh. Tarik napas, buka reflog, dan selamatkan kerjaanmu.
Tantangan
Hancurkan lalu selamatkan
Buat branch korban, commit 2 kali di sana, catat hash commit terakhir. Hapus branch dengan git branch -D korban. Lalu selamatkan: cari hash-nya di git reflog dan buat ulang branch dari hash itu. Verifikasi kedua commit kembali dengan git log --oneline.