git reset: Soft, Mixed, Hard
Memahami tiga mode reset dan kapan masing-masing aman dipakai.
Reset itu cuma memindahkan pointer
Banyak pemula mengira git reset itu "menghapus commit". Lebih tepatnya: ia memindahkan pointer branch aktif ke commit lain. Bayangkan branch main itu sticky note yang ditempel di commit; git reset mencabutnya dan menempelkannya di commit yang lebih lama.
Perintah ini ada karena manusia sering commit terlalu cepat: pesan typo, file kurang, eksperimen gagal total. Reset adalah tombol "ulangi langkah terakhir" dengan tiga level: --soft, --mixed (default), dan --hard. Bedanya cuma satu: seberapa jauh perubahanmu ikut "dibatalkan".
- --soft: staging dan working dir TIDAK disentuh. Commit dibatalkan tapi perubahannya tetap ter-staging, siap di-commit ulang (misalnya dengan pesan yang lebih baik).
- --mixed (default): staging dikosongkan, working dir tidak disentuh. Perubahan tetap ada sebagai file termodifikasi, tinggal add ulang.
- --hard: staging DAN working dir dikembalikan ke commit tujuan. Perubahan yang belum di-commit hilang permanen.
Contoh 1: pesan commit typo (soft)
Skenario: isi commit benar, cuma pesannya typo.
git log --oneline -2b7c8d9e Tambah validasi from login
a1b2c3d Perbaiki typo di README
"from" harusnya "form". Batalkan commitnya tapi pertahankan semua isi yang sudah di-staging:
git reset --soft HEAD~1
git commit -m "Tambah validasi form login"[main e4f5a6b] Tambah validasi form login
1 file changed, 24 insertions(+)
Beres. Tidak perlu add ulang karena --soft tidak menyentuh staging.
Contoh 2: pecah satu commit jadi dua (mixed)
Skenario: kamu commit dua topik sekaligus, pengin dipisah biar rapi.
git reset HEAD~1 # mixed: perubahan jadi unstaged
git status --short M src/login.js
M README.md
Perubahan masih utuh di working dir, hanya jadi unstaged. Commit per bagian:
git add src/login.js
git commit -m "Tambah validasi form login"
git add README.md
git commit -m "Perbaiki typo di README"Pakai git add -p untuk memilih potongan per baris kalau dua topik tercampur dalam satu file.
Contoh 3: eksperimen gagal total (hard)
Skenario: kamu coba-coba sesuatu, ternyata berantakan dan pengin buang semuanya.
git reset --hard HEAD~1HEAD is now at a1b2c3d Perbaiki typo di README
Working dir dan staging langsung kembali ke commit tujuan. Cepat dan brutal: inilah satu dari sedikit perintah Git yang menghancurkan data (jalan terakhirnya cuma reflog, modul Mahir berikutnya).
Aturan pakainya sederhana:
- AMAN: commit yang mau dibuang BELUM di-push dan BELUM dishare ke siapa pun.
- DILARANG:
reset --harddi branch bersama yang sudah di-push, karena riwayat semua orang ikut rusak.
Sebelum --hard, selalu git status dulu, dan git stash kalau ada yang berharga.
Catatan teknis:
HEAD~1berarti "satu commit sebelum HEAD",HEAD~3berarti tiga ke belakang. Bisa juga pakai hash langsung:git reset --soft a3f9c1d. Reset tidak menghapus commit dari database Git seketika; commit lama jadi "yatim" dan akhirnya dibersihkan garbage collector.
Ringkasan
| Niat | Perintah |
|---|---|
| Perbaiki pesan commit terakhir | reset --soft HEAD~1 |
| Batalkan commit, edit ulang isinya | reset HEAD~1 (mixed) |
| Buang total eksperimen lokal | reset --hard HEAD~1 |
| Batalkan commit yang SUDAH di-push | JANGAN reset, pakai revert |
Kesalahan umum pemula
SALAH: reset --hard tanpa cek status dulu.
git reset --hard HEAD~1 # padahal ada file penting belum di-commit!Perubahan yang belum di-commit lenyap seketika, tanpa undo biasa.
BENAR: cek dulu, amankan yang berharga, baru hard reset.
git status # ada yang belum di-commit?
git stash push -m "cadangan" # amankan kalau ragu
git reset --hard HEAD~1Kesalahan kedua: reset untuk commit yang sudah di-push ke branch tim lalu force push. Itu merusak riwayat semua orang. Untuk yang sudah dishare, pakai git revert.
Tantangan
Pecah satu commit
Buat 1 commit berisi 2 perubahan tak berkaitan (ubah 2 file berbeda). Lalu git reset HEAD~1, dan commit ulang jadi 2 commit terpisah dengan pesan masing-masing. Verifikasi dengan git log --oneline -2.