Pertemuan Pertemuan 25

Reflog, Reset, dan Revert

Pertemuan 25 / 32
Advanced Modul 3.2 60 menit
Pertemuan 25

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 --hard akan 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?

SituasiGunakan
Commit belum di-pushgit reset
Commit sudah di-push/sharedgit revert
Ingin menjaga historygit 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

  1. Buat repository baru dengan 5 commit, lalu praktikkan ketiga mode reset (soft, mixed, hard) β€” gunakan reflog untuk recovery setiap kali
  2. Praktikkan git revert pada commit di tengah history (bukan commit terakhir)
  3. Baca dokumentasi resmi: https://git-scm.com/docs/git-reflog
  4. Pahami kapan menggunakan reset vs revert dalam workflow nyata