Reflog

Reflog sebagai catatan setiap pergerakan HEAD dan jaring pengaman pemulihan commit yang terasa hilang.

Daftar isi

Kesimpulan yang paling menenangkan dari seluruh modul pembatalan adalah bahwa Git hampir tidak pernah menghapus sesuatu secara diam-diam, dan buktinya adalah reflog. Reflog mencatat setiap pergerakan HEAD pada repository lokal, termasuk commit, berpindah branch, reset, dan amend, sehingga commit yang terasa hilang tetap dapat ditemukan dan dikembalikan. Topik ini membahas cara membaca reflog dan dua pola pemulihan yang paling sering menyelamatkan pekerjaan.

Apa yang dicatat reflog#

Reflog adalah catatan pribadi milik repository lokal, dan isinya adalah baris-baris peristiwa: setiap kali HEAD berpindah, Git menambahkan baris berisi hash hasil perpindahan dan keterangannya. Catatan ini tidak pernah dikirim ke remote dan tidak ikut tersalin saat clone, karena tujuannya memulihkan kesalahan pada repository itu sendiri, bukan menyimpan sejarah penuh.

Buat riwayat yang sengaja dirusak dengan git reset --hard, lalu amati jejaknya.

bash
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"
bash
rm -rf /tmp/lab-reflog
mkdir /tmp/lab-reflog
cd /tmp/lab-reflog
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Satu.\n" > berkas.txt
git add berkas.txt
git commit -m "Satu"
printf "Satu.\nDua.\n" > berkas.txt
git commit -am "Dua"
printf "Satu.\nDua.\nTiga.\n" > berkas.txt
git commit -am "Tiga"
git reset --hard HEAD~2
git log --oneline
text Keluaran
Initialized empty Git repository in /tmp/lab-reflog/.git/
[main (root-commit) 04068da] Satu
 1 file changed, 1 insertion(+)
 create mode 100644 berkas.txt
[main 83d9ee7] Dua
 1 file changed, 1 insertion(+)
[main 968dadf] Tiga
 1 file changed, 1 insertion(+)
HEAD is now at 04068da Satu
04068da Satu

Dari sisi git log, dua commit terakhir sudah tidak terlihat sama sekali, karena log menelusuri rantai parent dari commit yang ditunjuk branch. Keadaan inilah yang terasa seperti kehilangan pekerjaan, dan reflog membuktikan sebaliknya.

Membaca catatan pergerakan HEAD#

Perintah git reflog menampilkan catatan pergerakan HEAD dari peristiwa terbaru ke yang paling lama.

bash
git reflog
text Keluaran
04068da HEAD@{0}: reset: moving to HEAD~2
968dadf HEAD@{1}: commit: Tiga
83d9ee7 HEAD@{2}: commit: Dua
04068da HEAD@{3}: commit (initial): Satu

Setiap baris memuat hash keadaan HEAD setelah peristiwa itu, sebutan posisi seperti HEAD@{1}, dan keterangan peristiwanya. Baris reset: moving to HEAD~2 adalah peristiwa yang tadi dianggap merusak, dan baris di bawahnya memuat hash commit Tiga yang oleh log dianggap hilang. Penamaan HEAD@{n} menyatakan keadaan HEAD n peristiwa yang lalu, sehingga menjadi alamat langsung untuk pemulihan tanpa menyalin hash.

Memulihkan commit yang terasa hilang#

Pemulihan berbentuk pemindahan penunjuk kembali ke keadaan sebelum kejadian, dan caranya sama dengan reset yang tadi dipakai.

bash
git reset --hard HEAD@{1}
git log --oneline
text Keluaran
HEAD is now at 968dadf Tiga
968dadf Tiga
83d9ee7 Dua
04068da Satu

Riwayat kembali utuh, dan catatan reflog bertambah satu baris yang mencatat pemulihan itu sendiri. Bentuk pemulihan kedua lebih lembut, yaitu membuat branch pada hash yang dituju dengan git branch pemulihan 8a2c4e6, sehingga keadaan tersebut memperoleh penunjuk tetap tanpa memindahkan branch aktif. Bentuk ini tepat untuk memulihkan branch yang terhapus, karena penunjuknya memang tidak ada lagi dan yang tersisa hanya hash pada reflog.

Masa simpan reflog juga perlu diketahui agar jaring pengaman ini tidak dianggap kekal. Baris yang menunjuk commit yang tidak lagi dicapai branch mana pun disimpan secara bawaan selama sekitar 90 hari, dan setelah itu pengumpul sampah Git dapat membersihkannya. Pemulihan yang disadari perlu dilakukan dalam jendela itu, atau diamankan lebih awal dengan branch pemulihan.

Menelusuri reflog dengan waktu#

Catatan reflog juga dapat dibaca dengan penanda waktunya, yang berguna apabila posisi numerik seperti HEAD@{1} tidak mudah dihitung pada catatan yang panjang. Opsi --date=iso menampilkan waktu setiap peristiwa dengan format tanggal lengkap.

bash
git reflog --date=iso -4
text Keluaran
968dadf HEAD@{2026-11-01 09:00:00 +0700}: reset: moving to HEAD@{1}
04068da HEAD@{2026-11-01 09:00:00 +0700}: reset: moving to HEAD~2
968dadf HEAD@{2026-11-01 09:00:00 +0700}: commit: Tiga
83d9ee7 HEAD@{2026-11-01 09:00:00 +0700}: commit: Dua

Keluaran pada penyetelan tertentu menampilkan waktu peristiwa di samping catatannya, dan bentuk HEAD@{waktu} pun diterima sebagai alamat, sehingga keadaan HEAD pada pukul tertentu dapat dimintai langsung. Pada pemulihan keadaan yang bercampur banyak reset dan perpindahan, membaca reflog dengan waktunya mempersempit pencarian dengan cepat, dan hash pada baris yang tepat menjadi alamat pemulihannya.

Reflog milik setiap penunjuk#

Perintah git reflog tanpa argumen menampilkan catatan HEAD, dan setiap penunjuk lain memiliki catatannya sendiri. Branch menyimpan reflog berisi pergerakannya, sehingga keadaan sebelum sebuah branch dipindahkan atau direset dapat dilihat pada reflog branch tersebut, bukan hanya pada reflog HEAD.

bash
git reflog show main -3
text Keluaran
968dadf main@{0}: reset: moving to HEAD@{1}
04068da main@{1}: reset: moving to HEAD~2
968dadf main@{2}: commit: Tiga

Penamaan main@{n} mengikuti pola yang sama dengan HEAD@{n}, dan alamat inilah yang dipakai saat memulihkan branch yang penunjuknya tergelincir tanpa mengganggu posisi HEAD saat ini. Keberadaan dua catatan ini menjelaskan mengapa pemulihan hampir selalu mungkin: peristiwa yang menggeser penunjuk mana pun selalu tertulis pada catatan penunjuk itu sendiri.

Ringkasan#

  • Reflog mencatat setiap pergerakan HEAD pada repository lokal, termasuk reset dan amend yang membuat commit terasa hilang.
  • Catatannya dibaca dengan git reflog, dan alamat HEAD@{n} menyebut keadaan HEAD n peristiwa yang lalu.
  • Pemulihan dilakukan dengan git reset --hard HEAD@{n} untuk mengembalikan posisi, atau git branch nama hash untuk memberi penunjuk tetap.
  • Baris reflog menuju commit yang tak tercapai disimpan sekitar 90 hari, dan reflog tidak pernah menjadi cadangan lintas mesin.

Referensi#