TL;DR: untuk membatalkan commit terakhir tapi tetap menyimpan perubahannya, jalankan git reset --soft HEAD~1 (perubahan tetap ter-staging) atau git reset HEAD~1 (perubahan tetap di working tree). Jika commitnya sudah di-push, jalankan git revert HEAD sebagai gantinya — ia membuat commit baru yang membatalkannya tanpa menulis ulang riwayat. Tiga perintah itu menutup hampir semua momen “saya commit terlalu cepat”. Sisa panduan ini membahas tiap kasus dengan perintah siap salin, menjelaskan beda --soft, --mixed, dan --hard, serta menunjukkan cara pemulihan bila ada yang keliru. Semua perintah di bawah bekerja di instalasi Git terkini apa pun di Linux, macOS, atau Windows.
Bagaimana cara membatalkan commit terakhir tapi tetap menyimpan perubahannya?
Situasi paling umum: Anda baru saja commit, lalu menyadari ada typo, ada berkas yang tertinggal, atau bahwa perubahan itu seharusnya masuk commit lain. Belum ada yang di-push. Batalkan commitnya dan kembalikan semuanya ke tempat semula:
# Commit lenyap dari riwayat — perubahan kembali ke staging area
git reset --soft HEAD~1
# Perubahan kembali ke working tree (tidak ter-staging) sebagai gantinya
git reset HEAD~1 HEAD~1 berarti “satu commit sebelum posisi HEAD sekarang”. Setelah salah satu perintah itu, berkas Anda tak tersentuh di disk — yang berpindah hanya penunjuk branch. Cek dengan git status: dengan --soft perubahan ter-staging, siap di-commit ulang sambil melipat perbaikan; tanpa flag, perubahan tidak ter-staging, jadi Anda bisa mengedit dulu dengan leluasa.
Kebiasaan yang lebih aman saat Anda hanya ingin menambah berkas ke commit terakhir: jangan membatalkannya sama sekali.
git add forgotten-file.txt
git commit --amend --no-edit --amend mengganti commit terakhir di tempat (di sini pesan commitnya tak diubah). Catatan: mengamend commit yang sudah di-push berarti menulis ulang riwayat — lebih lanjut di bawah.
Apa bedanya —soft, —mixed, dan —hard?
Bagian inilah yang layak dihafal, karena flag menentukan ke mana perubahan Anda berakhir — dan apakah mereka bisa hilang:
| Flag | Commit dibatalkan? | Perubahan di disk | Ter-staging? | Kegunaan tipikal |
|---|---|---|---|---|
--soft | Ya | Disimpan | Ya | Commit ulang dengan perbaikan kecil |
--mixed (bawaan) | Ya | Disimpan | Tidak | Kelompokkan ulang perubahan, staging selektif |
--hard | Ya | Terhapus | — | Buang seluruh pekerjaan |
git revert | Tidak (commit baru) | Disimpan | — | Batalkan commit yang sudah di-push |
--hard satu-satunya yang berbahaya: ia membuang commit dan perubahannya. Sebelum reset --hard apa pun, simpan dulu pekerjaan Anda di stash atau branch:
git branch backup-before-reset # asuransi murah
git reset --hard HEAD~1 # commit + perubahan lenyap Jika versi berbahayanya sudah terlanjur dijalankan, belum semuanya hilang — git reflog masih mengingat ke mana HEAD pernah menunjuk:
git reflog # temukan hash commit yang hilang
git reset --hard HEAD@{1} # atau: git reset --hard <hash> Reflog menyimpan commit menggantung selama sekitar 90 hari secara bawaan, jadi “saya hard-reset tanpa sengaja” hampir selalu bisa dipulihkan asal Anda bertindak sebelum garbage collection.
Bagaimana kalau commitnya sudah di-push?
Jika commit berada di branch bersama (apa pun selain feature branch pribadi Anda), jangan menulis ulang riwayat. Gunakan git revert, yang menghitung perubahan kebalikannya lalu meng-commit-nya:
git revert HEAD
git push Semua orang yang menarik cukup menerima commit baru yang menghapus perubahan commit lama. Tanpa force-push, tanpa rekan kerja yang branch-nya rusak. Jika perlu membatalkan serangkaian commit, revert rentangnya: git revert --no-commit HEAD~3..HEAD && git commit.
Alternatifnya — git reset --hard HEAD~1 && git push --force-with-lease — hanya bisa diterima di branch yang tidak dibangun siapa pun, dan --force-with-lease (bukan --force polos) satu-satunya bentuk yang aman karena ia menolak bila ada orang lain yang sudah mendorong di sela. Force-push di branch bersama adalah cara tim kehilangan commit dan log CI yang tiba-tiba tak cocok dengan checkout siapa pun.
Bagaimana cara membatalkan commit terakhir tapi tetap menyimpannya untuk nanti?
Kadang commitnya kerja bagus di alamat yang salah — di branch yang keliru, atau terlalu cepat. Daripada membatalkannya, pindahkan:
git branch stash-commit # parkirkan commit di branch baru
git reset --hard HEAD~1 # lalu bersihkan branch Anda saat ini Atau bawa hanya commit itu ke branch lain tanpa menyentuh branch Anda:
git cherry-pick <hash> # sambil berada di branch tujuan Dengan reset --soft, cherry-pick, dan revert, tidak ada commit yang tak bisa dipindahkan atau dinetralkan — kuncinya memilih “pindah” atau “batalkan” sebelum tangan mencapai flag.
Undo mana yang sebaiknya saya pakai? Panduan cepat memutuskan
- Belum di-push, ingin memperbaiki lalu commit ulang →
git reset --soft HEAD~1 - Belum di-push, ingin men-staging ulang secara selektif →
git reset HEAD~1(mixed) - Ingin perubahannya benar-benar hilang →
git reset --hard HEAD~1(reflog masih ingat, kalau Anda menyesal) - Sudah di-push ke branch bersama →
git revert HEAD - Commitnya milik branch lain →
cherry-pick, jangan dibatalkan
Satu tips operasional terakhir: jika commit buruk sempat sampai ke server — deploy hook yang kacau, CI runner yang nakal setelah force-push — tempat mencari berikutnya adalah log mesinnya, bukan Git. Di mesin systemd mana pun, journalctl -u <service> -n 100 menunjukkan persis apa yang berjalan dan kapan; journalctl cheat sheet kami punya pola siap salinnya. Dan jika alur kerja Anda mencakup tooling LLM lokal untuk meninjau diff, kami membandingkan dua pilihan utamanya di Ollama vs LM Studio.
— mrsaynothing
Get the next one by email
One email per post. No spam, no algorithms.
what is this?Cheat Sheet journalctl: Pantau, Saring, dan Ikuti Log Linux
Suka tulisannya? Saya membangun seperti ini untuk hidup. pekerjakan saya