Salah satu alasan terbesar orang belajar Git adalah untuk bisa “mundur” saat terjadi kesalahan. Git menyediakan berbagai cara untuk membatalkan perubahan — masing-masing cocok untuk situasi yang berbeda. Memilih perintah yang tepat sangat penting karena beberapa di antaranya tidak bisa di-undo.
Peta Situasi dan Solusinya
Situasi Solusi
─────────────────────────────────────────────────────
File diedit, belum di-add → git restore <file>
File sudah di-add (staged) → git restore --staged <file>
Commit terakhir salah pesan → git commit --amend
Commit terakhir mau dibatal → git reset HEAD~1
Beberapa commit mau dibatal → git reset HEAD~N
Batalkan commit tapi aman → git revert <hash>
1. Membatalkan Perubahan di Working Directory
File sudah diedit tapi belum di-git add. Kamu ingin membuang semua perubahan dan kembali ke kondisi commit terakhir.
# Buang perubahan di satu file (TIDAK BISA DIUNDO!)
git restore src/auth.js
# Buang semua perubahan di semua file
git restore .
# Cara lama (masih bekerja)
git checkout -- src/auth.js
Peringatan: Perubahan yang di-restore dengan cara ini hilang permanen. Tidak ada di trash bin.
2. Mengeluarkan File dari Staging Area (Unstage)
File sudah di-git add tapi belum di-commit. Kamu ingin mengeluarkannya dari staging tanpa mengubah isi file.
# Unstage satu file
git restore --staged src/auth.js
# Unstage semua file
git restore --staged .
# Cara lama
git reset HEAD src/auth.js
File kembali ke status “modified” di working directory, isinya tidak berubah.
3. Amend — Memperbaiki Commit Terakhir
git commit --amend memungkinkan kamu mengubah commit terakhir sebelum di-push ke remote.
Ubah Pesan Commit Terakhir
git commit --amend -m "feat(auth): tambah login Google OAuth dengan error handling"
Tambahkan File yang Lupa Di-commit
# Lupa add satu file saat commit tadi
git add src/forgot-file.js
# Amend tanpa mengubah pesan commit
git commit --amend --no-edit
Penting:
--amendmembuat commit baru yang menggantikan commit terakhir. Hash commit berubah. Jangan amend commit yang sudah di-push ke remote karena akan menyebabkan konflik untuk orang lain.
4. git reset — Mundur ke Commit Tertentu
git reset memindahkan pointer HEAD (dan branch) ke commit tertentu. Ada tiga mode:
--soft — Mundur tapi Perubahan Tetap di Staging
git reset --soft HEAD~1
- HEAD mundur 1 commit
- Perubahan dari commit yang dibatalkan masih ada di staging area
- File tidak berubah
- Cocok untuk: “saya mau undo commit tapi perubahan kodenya masih saya butuhkan, nanti commit ulang”
--mixed (Default) — Mundur tapi Perubahan di Working Directory
git reset HEAD~1
# sama dengan
git reset --mixed HEAD~1
- HEAD mundur 1 commit
- Perubahan kembali ke working directory (unstaged)
- File tidak berubah
- Cocok untuk: “mau undo commit dan susun ulang staging”
--hard — Mundur dan Buang Semua Perubahan
git reset --hard HEAD~1
- HEAD mundur 1 commit
- Semua perubahan dari commit yang dibatalkan hilang permanen
- File kembali persis seperti kondisi commit target
- Cocok untuk: “hapus commit ini dan semua perubahannya, saya tidak butuh lagi”
Mundur ke Commit Spesifik
# Mundur ke commit tertentu (pakai hash)
git reset --hard a1b2c3d
# Mundur 3 commit ke belakang
git reset --soft HEAD~3
5. git revert — Cara Aman Membatalkan Commit yang Sudah Di-push
git revert membuat commit baru yang kebalikan dari commit yang ingin dibatalkan, tanpa mengubah histori.
# Batalkan commit tertentu dengan membuat commit baru
git revert a1b2c3d
# Batalkan tanpa langsung membuka editor pesan
git revert a1b2c3d --no-edit
# Batalkan tapi jangan langsung commit (staging dulu)
git revert -n a1b2c3d
Kapan Pakai reset vs revert?
git reset |
git revert |
|
|---|---|---|
| Mengubah histori | Ya | Tidak |
| Aman untuk push | Tidak | Ya |
| Bisa undo commit lama | Sulit | Mudah |
| Cocok untuk | Commit lokal yang belum di-push | Commit yang sudah di-push |
6. Mengembalikan File ke Versi Commit Tertentu
# Kembalikan satu file ke versi di commit tertentu
git restore --source a1b2c3d src/auth.js
# Kembalikan ke 2 commit sebelumnya
git restore --source HEAD~2 src/auth.js
# Cara lama
git checkout a1b2c3d -- src/auth.js
File dikembalikan ke working directory, belum di-commit. Kamu bisa review dan commit jika sesuai.
7. git reflog — Jaring Pengaman Terakhir
git reflog merekam semua pergerakan HEAD, bahkan perubahan yang dibatalkan dengan git reset --hard. Ini adalah penyelamat saat tidak sengaja menghapus commit penting.
git reflog
a1b2c3d (HEAD -> main) HEAD@{0}: commit: feat: tambah fitur baru
b2c3d4e HEAD@{1}: reset: moving to HEAD~1
c3d4e5f HEAD@{2}: commit: wip: pekerjaan setengah jadi
Untuk memulihkan commit yang sudah di-reset:
# Temukan hash commit yang hilang dari reflog
git reflog
# Reset kembali ke commit tersebut
git reset --hard c3d4e5f
git refloghanya tersimpan di lokal dan secara default dihapus setelah 90 hari.
Kesimpulan
Kemampuan membatalkan perubahan dengan tepat adalah tanda developer Git yang matang. Aturan praktisnya:
- Belum di-push → boleh gunakan
resetatauamend - Sudah di-push → gunakan
revert - Tidak sengaja hapus sesuatu → cek
reflog
Di artikel berikutnya, kita masuk ke salah satu fitur terkuat Git: Branching dan Merging.
Kiki/🎮🍉⌨️🍩💻