gitresetMenengah5 mnt baca

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.

bash
git log --oneline -2
b7c8d9e Tambah validasi from login a1b2c3d Perbaiki typo di README

"from" harusnya "form". Batalkan commitnya tapi pertahankan semua isi yang sudah di-staging:

bash
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.

bash
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:

bash
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.

bash
git reset --hard HEAD~1
HEAD 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 --hard di 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~1 berarti "satu commit sebelum HEAD", HEAD~3 berarti 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

NiatPerintah
Perbaiki pesan commit terakhirreset --soft HEAD~1
Batalkan commit, edit ulang isinyareset HEAD~1 (mixed)
Buang total eksperimen lokalreset --hard HEAD~1
Batalkan commit yang SUDAH di-pushJANGAN reset, pakai revert

Kesalahan umum pemula

SALAH: reset --hard tanpa cek status dulu.

bash
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.

bash
git status                # ada yang belum di-commit?
git stash push -m "cadangan"   # amankan kalau ragu
git reset --hard HEAD~1

Kesalahan 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.