Pernahkah kamu secara tidak sengaja menghapus commit penting, atau reset branch ke commit yang salah, dan merasa semua perubahan hilang selamanya? Jangan panik — Git Reflog adalah fitur救命 (kyūmei / penyelamat) yang jarang dikenal tapi sangat powerful untuk recovery.
Git menyimpan histori lengkap setiap perubahan HEAD, termasuk commit yang sudah di-reset, di-rebase, atau bahkan di-force push. Dengan git reflog, kamu bisa “kembali ke masa lalu” dan mengembalikan commit yang hilang.
Apa itu Git Reflog?
Reflog (reference log) adalah log lokal yang merekam setiap perubahan HEAD di repository. Setiap kali kamu checkout, commit, reset, rebase, atau merge, Git mencatatnya di reflog.
Perbedaan dengan git log:
git log: Menampilkan histori commit di branch aktifgit reflog: Menampilkan histori gerakan HEAD, termasuk commit yang sudah “terhapus”
Reflog bersifat lokal dan temporary (default 90 hari), jadi tidak akan ter-push ke remote.
Cara Melihat Reflog
git reflog
Output contoh:
f4e3c21 HEAD@{0}: commit: Fix bug di halaman login
a1b2c3d HEAD@{1}: reset: moving to HEAD~1
d9e8f7g HEAD@{2}: commit: Add validasi form
c6b5a4f HEAD@{3}: checkout: moving from feature to main
...
Penjelasan:
HEAD@{0}: Posisi HEAD saat iniHEAD@{1}: Posisi sebelumnya (1 langkah ke belakang)HEAD@{2}: 2 langkah ke belakang, dan seterusnya
Melihat reflog branch tertentu:
git reflog show main
Scenario 1: Mengembalikan Commit yang Di-reset
Kasus:
Kamu melakukan git reset --hard HEAD~2 dan ingin mengembalikan 2 commit yang terhapus.
Langkah Recovery:
1. Lihat reflog untuk mencari commit yang hilang:
git reflog
Output:
a1b2c3d HEAD@{0}: reset: moving to HEAD~2
d9e8f7g HEAD@{1}: commit: Add feature X
e5f6g7h HEAD@{2}: commit: Fix typo
2. Kembali ke commit sebelum reset:
git reset --hard HEAD@{1}
# atau
git reset --hard d9e8f7g
3. Verifikasi:
git log --oneline
Commit yang terhapus kembali muncul!
Scenario 2: Mengembalikan Branch yang Dihapus
Kasus:
Kamu menghapus branch dengan git branch -D feature-x dan baru sadar branch itu masih dibutuhkan.
Langkah Recovery:
1. Cari commit terakhir dari branch yang dihapus:
git reflog | grep feature-x
Output:
c6b5a4f HEAD@{5}: checkout: moving from feature-x to main
a9b8c7d HEAD@{6}: commit: Implement feature X
2. Buat ulang branch dari commit terakhir:
git checkout -b feature-x a9b8c7d
Branch feature-x berhasil di-restore dengan semua commit-nya!
Scenario 3: Mengembalikan Commit Setelah Rebase
Kasus: Rebase berjalan, tapi hasilnya berantakan. Kamu ingin membatalkannya.
Langkah Recovery:
1. Lihat reflog untuk mencari state sebelum rebase:
git reflog
Output:
f4e3c21 HEAD@{0}: rebase finished: refs/heads/feature
a1b2c3d HEAD@{1}: rebase: Add feature Y
d9e8f7g HEAD@{10}: checkout: moving from feature to main
2. Kembali ke state sebelum rebase:
git reset --hard HEAD@{10}
Rebase dibatalkan, branch kembali ke kondisi awal!
Scenario 4: Mengembalikan Commit yang Di-amend
Kasus:
Kamu melakukan git commit --amend dan menimpa commit lama, tapi ternyata commit lama masih dibutuhkan.
Langkah Recovery:
1. Lihat reflog:
git reflog
Output:
f4e3c21 HEAD@{0}: commit (amend): Fix typo in README
e5f6g7h HEAD@{1}: commit: Add README
2. Checkout commit sebelum amend:
git checkout e5f6g7h
3. (Opsional) Buat branch baru dari commit lama:
git checkout -b backup-readme e5f6g7h
Melihat Diff Antar Posisi Reflog
Bandingkan perubahan antara dua posisi HEAD:
git diff HEAD@{1} HEAD@{0}
Lihat file apa saja yang berubah:
git diff --name-only HEAD@{2} HEAD@{0}
Membersihkan Reflog
Reflog secara default akan expire dalam 90 hari. Tapi jika ingin manual cleanup:
Hapus reflog entries yang lebih tua dari 30 hari:
git reflog expire --expire=30.days --all
Hapus reflog entries yang unreachable:
git reflog expire --expire-unreachable=now --all
git gc --prune=now
⚠️ Hati-hati: Setelah di-prune, commit yang unreachable tidak bisa di-recovery lagi.
Tips Menggunakan Reflog dengan Aman
✅ Selalu cek reflog sebelum reset:
git reflog
git reset --hard HEAD@{n}
✅ Gunakan --no-ff saat merge untuk memperjelas reflog:
git merge --no-ff feature
✅ Buat backup branch sebelum operasi berbahaya:
git branch backup-main
git rebase main
✅ Jangan andalkan reflog di remote: Reflog bersifat lokal dan tidak ter-push.
Kesimpulan
Git Reflog adalah safety net yang harus diketahui setiap developer. Dengan reflog, kamu bisa:
- Mengembalikan commit yang terhapus setelah reset
- Restore branch yang sudah dihapus
- Membatalkan rebase atau merge yang salah
- Recovery dari commit amend yang tidak disengaja
Key Takeaway:
- Reflog mencatat semua gerakan HEAD
- Gunakan
git refloguntuk melihat histori - Gunakan
git reset --hard HEAD@{n}untuk kembali ke posisi tertentu - Reflog bersifat lokal dan expire dalam 90 hari
Di artikel berikutnya, kita akan membahas Git Submodules dan Subtree untuk mengelola dependency antar repository. Stay tuned!
Kiki/🎮🍉⌨️🍩💻