Menyelamatkan Commit dengan reflog
Pulih dari kesalahan reset --hard atau branch terhapus memakai catatan reflog.
"Saya menghapus pekerjaan saya!"
Setiap pengguna Git pernah menjalankan git reset --hard ke commit yang salah, atau menghapus branch yang belum digabung, lalu panik karena commit tampaknya lenyap dari git log. Kabar baik: hampir selalu commit itu masih ada. Git menyimpan catatan ke mana HEAD pernah menunjuk: reflog.
Membaca reflog
git reflog
e064cf4 HEAD@{0}: reset: moving to HEAD~2
1af2065 HEAD@{1}: commit: Tambah fitur penting
e064cf4 HEAD@{2}: commit: Commit dua
5767e11 HEAD@{3}: commit (initial): Commit satu
Setiap baris = satu perpindahan HEAD (commit, checkout, merge, reset, rebase...). HEAD@{1} artinya "tempat HEAD berada satu langkah yang lalu".
Di contoh, commit Tambah fitur penting (1af2065) hilang dari git log karena reset, tetapi tertulis jelas di reflog.
Memulihkan
git reset --hard HEAD@{1} # kembalikan branch ke posisi sebelum reset
# atau, lebih hati-hati: simpan di branch baru tanpa menyentuh yang sekarang
git branch pulih 1af2065
git switch pulih
Memulihkan branch yang terhapus
git branch -D fitur-lama # oops
git reflog # cari commit terakhir branch itu
git branch fitur-lama a1b2c3d # buat ulang di commit tersebut
Batasan reflog
- Bersifat lokal: tidak ikut di-push; hanya ada di komputer tempat kejadian.
- Entri kedaluwarsa (default sekitar 90 hari untuk yang dapat dijangkau, 30 hari untuk yang tidak) lalu dibersihkan oleh garbage collection.
- Hanya menyelamatkan yang pernah di-commit. Perubahan yang tidak pernah di-add/commit (mis. dibuang oleh
git restore) tidak bisa dipulihkan.
Tips
git reflog show mainmenampilkan riwayat khusus branch main.- Referensi waktu:
HEAD@{yesterday},main@{2.hours.ago}. - Sebelum operasi berisiko (rebase besar, reset --hard), buat branch cadangan:
git branch cadangan.
Pelajaran terbesar
Git sangat memaafkan: selama sesuatu pernah di-commit, hampir selalu ada jalan kembali. Itu alasan terbaik untuk sering commit.