Commit terakhir yang keliru — pesan salah ketik, berkas tertinggal, atau perubahan yang sama sekali tak seharusnya ada — punya banyak wajah, dan Git menyediakan tiga jalur pembatalan yang berbeda untuknya: reset --soft, reset --hard, dan revert. Salah pilih jalur bukan sekadar tidak optimal: reset --hard pada commit yang sudah dibagikan ke rekan kerja bisa memutus sinkronisasi seluruh tim. Chapter ini memetakan dulu situasi ke perintahnya lewat satu tabel, menghidupkan ketiganya di sandbox terpisah, lalu menutup dengan alur keputusan yang bisa dipegang saat panik.

Peta Tiga Jalur dan Satu Pengecualian #

Sebelum menyentuh terminal, keputusannya harus jelas. Tiga pertanyaan menentukan jalurnya: apakah commit sudah di-push, apakah isinya masih ingin dipertahankan, dan seberapa besar kesalahannya:

SituasiPerintahEfek pada riwayat
Belum di-push, isi mau dirapikan jadi satu commitgit reset --soft HEAD~1 lalu commit ulangCommit lama diganti, perubahan tetap staged
Belum di-push, isi dibuang totalgit reset --hard HEAD~1Commit dan perubahannya lenyap dari branch
Sudah di-push / dipakai orang laingit revert HEADLahir commit baru yang membatalkan isi HEAD
Hanya salah pesan atau berkas kecil yang tertinggalgit commit --amendCommit terakhir ditulis ulang di tempat

Pengecualian terakhir bukan jalur pembatalan sejati — --amend memperbaiki commit yang masih layak pakai, dibahas tuntas di Amend Commit . Mekanika reset lengkap (soft/mixed/hard) sendiri sudah dibedah di reset-soft-mixed-hard .

Jalur Pertama: reset –soft lalu commit ulang #

Skenario paling umum: commit sudah dibuat, lalu kita sadar pesannya kurang tepat dan ada satu typo kecil di isinya. Tiga sandbox terpisah dipakai agar tiap jalur makin bersih. Sandbox latihan-batal-soft memuat artikel dengan commit pendahuluan yang mengandung typo:

bash
mkdir latihan-batal-soft && cd latihan-batal-soft
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Artikel\nkerangka\n' > artikel.md
git add artikel.md
git commit -m "Susun kerangka artikel"
printf 'pendahulun singkat\n' > pendahuluan.md
git add pendahuluan.md
git commit -m "Tambahkan pendahuluan"
git log --oneline

Output yang Dihasilkan:

text
4782fab Tambahkan pendahuluan
cbf9d1e Susun kerangka artikel

Kata pendahulun kehilangan satu huruf. Jalur pertama membuka commit terakhir tanpa membuang kertas kerjanya — semua perubahan turun kembali ke staging area:

bash
git reset --soft HEAD~1
git status

Output yang Dihasilkan:

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   pendahuluan.md

Status menunjukkan pendahuluan.md kembali menjadi berkas staged. Perbaikan typo dilakukan di working tree, ditambahkan, lalu commit penggantinya lahir:

bash
printf 'pendahuluan singkat\n' > pendahuluan.md
git add pendahuluan.md
git commit -m "Tambahkan pendahuluan"
git log --oneline

Output yang Dihasilkan:

text
[main 5a38913] Tambahkan pendahuluan
 1 file changed, 1 insertion(+)
 create mode 100644 pendahuluan.md

Output yang Dihasilkan:

text
5a38913 Tambahkan pendahuluan
cbf9d1e Susun kerangka artikel

Riwayat tetap dua commit — commit lama yang typo diganti commit baru yang bersih, seolah kesalahan tak pernah terjadi.

Jalur Kedua: reset –hard untuk membuang total #

Kadang commit terakhir memang tidak ingin diselamatkan sama sekali: hasil eksperimen keliru arah, atau berkas yang tak semestinya ter-commit. Sandbox latihan-batal-hard menyiapkan satu commit percobaan di atas kerangka:

bash
mkdir latihan-batal-hard && cd latihan-batal-hard
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Toko\n' > README.md
git add README.md
git commit -m "Susun kerangka toko"
printf 'percobaan sementara\n' > eksperimen.txt
git add eksperimen.txt
git commit -m "Tulis catatan percobaan"
git log --oneline

Output yang Dihasilkan:

text
cd976c1 Tulis catatan percobaan
18247af Susun kerangka toko

Perintahnya satu baris dan tidak bisa lebih lugas:

bash
git reset --hard HEAD~1
git log --oneline
ls

Output yang Dihasilkan:

text
HEAD is now at 18247af Susun kerangka toko

Output yang Dihasilkan:

text
18247af Susun kerangka toko

Output yang Dihasilkan:

text
README.md

Riwayat kembali ke “Susun kerangka toko” dan eksperimen.txt lenyap dari working tree. Commit yang dibuang ini sebenarnya masih hidup di database — reflog bisa memulihkannya — tetapi suntingan yang belum pernah di-commit akan hilang sungguhan.

Jalur Ketiga: revert untuk riwayat bersama #

Bila commit keliru sudah di-push, jalur reset tertutup — menulis ulang riwayat bersama adalah sumber konflik. git revert tidak menyentuh riwayat lama; ia membuat commit baru yang isinya kebalikan dari commit yang dibatalkan. Sandbox latihan-batal-revert berisi kenaikan harga yang salah posting:

bash
mkdir latihan-batal-revert && cd latihan-batal-revert
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'harga kopi: 1000\n' > harga.md
git add harga.md
git commit -m "Buat daftar harga"
printf 'harga kopi: 5000\n' > harga.md
git add harga.md
git commit -m "Naikkan harga kopi jadi 5000"
git revert --no-edit HEAD

Output yang Dihasilkan:

text
[main b68a352] Revert "Naikkan harga kopi jadi 5000"
 Date: Thu Oct 22 12:05:00 2026 +0700
 1 file changed, 1 insertion(+), 1 deletion(-)
bash
git log --oneline
cat harga.md

Output yang Dihasilkan:

text
b68a352 Revert "Naikkan harga kopi jadi 5000"
6786f8b Naikkan harga kopi jadi 5000
b4dd639 Buat daftar harga

Output yang Dihasilkan:

text
harga kopi: 1000

Riwayat kini memuat kedua commit lama plus satu commit pembatal — Revert "Naikkan harga kopi jadi 5000" — sehingga pembatalan terekam sebagai bagian dari sejarah, dan harga.md kembali ke 1000. Opsi --no-edit memakai pesan bawaan "Revert \"<pesan commit asli>\""; tanpa opsi itu, Git membuka editor untuk menyunting pesan. Baris Date: pada keluaran revert memang selalu tercetak — kelakuan khas git revert yang tidak dimiliki git commit. Hasil revert aman di-push karena hanya menambah, bukan mengubah, apa yang sudah dikenal tim.

Alur Keputusan #

Ketiga jalur tadi dirangkum dalam satu alur yang bisa diikuti saat kepanikan datang:

Kotak amend mengambil jalan pintas hanya bila kerusakan kecil dan commit belum dibagikan. Referensi perilaku resmi ketiga perintah ada di git-revert dan git-reset .

Satu benda kerja sering ikut tersapu jalur reset: isi staging area. Bagaimanapun keadaannya, staging selalu bisa disusun ulang — dan itulah bahasan berikutnya di Memulihkan Staging .