Memperbaiki Commit: amend & reset
Mengoreksi commit terakhir dengan --amend dan menggulung riwayat dengan git reset (--soft, --mixed, --hard).
Commit terakhir ada yang kurang
Baru saja commit, lalu sadar: pesannya typo, atau ada berkas yang lupa dimasukkan. Daripada membuat commit "perbaikan kecil", ganti saja commit terakhir:
git commit --amend -m "Pesan yang sudah benar" # ubah pesan saja
echo "body{}" > style.css
git add style.css
git commit --amend --no-edit # tambah berkas, pesan tetap
--amend sebenarnya menggantikan commit terakhir dengan commit baru (hash berubah). Karena itu jangan pernah amend commit yang sudah di-push dan dipakai orang lain — riwayatnya jadi berbeda dan merepotkan tim.
git reset: memundurkan branch
git reset <commit> memindahkan ujung branch saat ini ke commit lain. Tiga mode menentukan apa yang terjadi pada staging dan working directory:
| Mode | Branch bergerak | Staging | Working directory |
|---|---|---|---|
--soft | Ya | Tetap (perubahan tetap staged) | Tetap |
--mixed (default) | Ya | Dikosongkan (disamakan dengan commit tujuan) | Tetap |
--hard | Ya | Dikosongkan | Ikut dikembalikan — perubahan hilang |
Kapan memakai yang mana
- --soft: "gabungkan beberapa commit jadi satu". Mundur 3 commit lalu commit ulang satu kali — perubahan masih staged.
- --mixed: "batalkan commit dan staging, tapi simpan edit" — untuk memecah commit yang terlalu besar menjadi beberapa.
- --hard: "buang semuanya, kembali ke commit itu". Berbahaya untuk perubahan yang belum di-commit; commit yang "terbuang" masih bisa diselamatkan lewat
reflog(bab 21).
Contoh: menggabungkan commit wip
Riwayat berantakan:
c3 wip lagi
c2 wip
c1 Tambah halaman utama
git reset --soft HEAD~2
git commit -m "Tambah halaman login"
Hasil: c1 tetap, dan dua commit wip menjadi satu commit rapi.
Aturan emas
Reset, amend, dan rebase menulis ulang riwayat. Aman dilakukan pada commit yang belum di-push (masih milikmu saja). Untuk commit yang sudah dibagikan, gunakan git revert (bab berikutnya).
git reset untuk berkas
git reset berkas (tanpa commit tujuan) = mengeluarkan berkas dari staging, sama dengan git restore --staged berkas.