Reflog, Reset, dan Revert
Tujuan Pembelajaran
- Memahami dan menggunakan git reflog sebagai safety net
- Menguasai git reset dengan 3 mode: soft, mixed, hard
- Memahami perbedaan git revert dan git reset
- Mampu melakukan recovery dari kesalahan menggunakan reflog
Materi Inti
A. Git Reflog β Safety Net
Reflog (reference log) mencatat semua pergerakan HEAD di repository lokal kamu. Ini termasuk commit, checkout, reset, rebase, dan operasi lainnya. Reflog adalah βsafety netβ terakhir ketika kamu kehilangan commit.
git reflog
# abc123 HEAD@{0}: commit: Commit terbaru
# def456 HEAD@{1}: checkout: moving from main to fitur
# ghi789 HEAD@{2}: commit: Commit sebelumnya
# jkl012 HEAD@{3}: reset: moving to HEAD~2 <- bisa recovery dari sini!
Poin penting tentang reflog:
- Reflog hanya ada di repository lokal (tidak di-push ke remote)
- Default masa berlaku: 90 hari untuk commit yang masih direferensikan, 30 hari untuk yang tidak
- Reflog mencatat SEMUA pergerakan HEAD, termasuk yang βhilangβ dari
git log
# Recovery: kembalikan ke state sebelum reset
git reset --hard def456
# Lihat reflog untuk branch tertentu
git reflog show main
# Lihat reflog dengan format waktu
git reflog --date=relative
B. Git Reset β 3 Mode
git reset menggerakkan HEAD (dan branch pointer) ke commit tertentu. Perbedaan antar mode terletak pada apa yang terjadi pada Staging Area dan Working Directory.
Working Dir Staging Area Commit History
git reset --soft TETAP TETAP BERUBAH
git reset --mixed TETAP BERUBAH BERUBAH
git reset --hard BERUBAH BERUBAH BERUBAH
# SOFT: undo commit, perubahan tetap di staging
# Cocok untuk: menggabungkan beberapa commit, memperbaiki pesan commit
git reset --soft HEAD~1
# MIXED (default): undo commit, perubahan tetap di working dir
# Cocok untuk: menyusun ulang perubahan sebelum commit
git reset HEAD~1
# HARD: undo SEMUA (BAHAYA -- perubahan hilang!)
# Cocok untuk: benar-benar ingin membuang perubahan
git reset --hard HEAD~1
Peringatan:
git reset --hardakan menghapus perubahan yang belum di-commit secara permanen. Selalu pastikan tidak ada perubahan penting sebelum menggunakan mode ini.
C. Git Revert β Undo yang Aman
Berbeda dengan reset, git revert membuat commit baru yang membatalkan perubahan dari commit tertentu. History tidak berubah, hanya ditambah commit baru.
# Revert satu commit
git revert abc123
# Revert tanpa langsung commit (bisa edit dulu)
git revert --no-commit abc123
# Revert merge commit (pilih parent)
git revert -m 1 <merge-commit-hash>
Kapan pakai Reset vs Revert?
| Situasi | Gunakan |
|---|---|
| Commit belum di-push | git reset |
| Commit sudah di-push/shared | git revert |
| Ingin menjaga history | git revert |
| Ingin history bersih (lokal) | git reset |
Demonstrasi: Recovery Workflow
mkdir latihan-recovery && cd latihan-recovery && git init
# Buat beberapa commit
echo "v1" > file.txt && git add . && git commit -m "v1"
echo "v2" > file.txt && git add . && git commit -m "v2"
echo "v3" > file.txt && git add . && git commit -m "v3"
# Lihat history
git log --oneline
# abc123 v3
# def456 v2
# ghi789 v1
# "Kesalahan": reset --hard ke v1
git reset --hard HEAD~2
cat file.txt # Kembali ke v1!
git log --oneline # v2 dan v3 "hilang" dari log!
# Recovery via reflog
git reflog
# Cari hash dari commit "v3"
git reset --hard HEAD@{1} # atau hash dari "v3"
cat file.txt # v3 kembali!
git log --oneline # v2 dan v3 kembali!
Demonstrasi Revert:
# Lanjutkan dari repo yang sama
echo "v4 - fitur bermasalah" > file.txt
git add . && git commit -m "v4: fitur bermasalah"
# Revert v4 (membuat commit baru yang membatalkan v4)
git revert HEAD
# Editor terbuka, simpan pesan default
cat file.txt # Kembali ke v3
git log --oneline
# History tetap lengkap: revert commit, v4, v3, v2, v1
Latihan Praktik
Latihan Terminal: Recovery Scenario
Skenario 1: Soft Reset untuk menggabungkan commit
mkdir latihan-reset && cd latihan-reset && git init
echo "index" > index.html && git add . && git commit -m "tambah index"
echo "style" > style.css && git add . && git commit -m "tambah style"
echo "script" > app.js && git add . && git commit -m "tambah script"
# Gabungkan 3 commit terakhir menjadi 1
git reset --soft HEAD~3
git status # Semua file ada di staging
git commit -m "feat: setup project awal (index, style, script)"
git log --oneline # Hanya 1 commit!
Skenario 2: Recovery setelah reset βhard yang tidak sengaja
cd ../latihan-recovery
echo "data penting" > penting.txt
git add . && git commit -m "tambah data penting"
# Oops! Tidak sengaja reset --hard
git reset --hard HEAD~1
ls # penting.txt hilang!
# Jangan panik! Gunakan reflog
git reflog
git reset --hard HEAD@{1}
ls # penting.txt kembali!
Skenario 3: Revert di branch yang sudah di-push
# Simulasi: commit yang sudah di-share
echo "bug code" > bug.js && git add . && git commit -m "tambah fitur (ada bug)"
# Gunakan revert (bukan reset) karena sudah di-share
git revert HEAD --no-edit
git log --oneline
# Perhatikan: ada commit revert baru, history tetap utuh
Tugas Mandiri
- Buat repository baru dengan 5 commit, lalu praktikkan ketiga mode reset (soft, mixed, hard) β gunakan reflog untuk recovery setiap kali
- Praktikkan git revert pada commit di tengah history (bukan commit terakhir)
- Baca dokumentasi resmi: https://git-scm.com/docs/git-reflog
- Pahami kapan menggunakan reset vs revert dalam workflow nyata