Undo di Git bukan satu tombol melainkan satu spektrum: batalkan suntingan, batalkan staging, batalkan commit, atau pulihkan pekerjaan yang tampak sudah lenyap. Chapter ini merangkum seluruh spektrum itu menjadi contekan bertabel tiga kolom — perintah, fungsi, contoh — terbagi tiga kelompok situasi: membatalkan sebelum commit, membatalkan commit, dan menyelamatkan yang hilang. Di ujungnya ada tabel keputusan yang memetakan kecelakaan paling umum langsung ke perintahnya, sehingga urutan baca yang praktis: temukan situasi kita di tabel keputusan, lalu naik ke tabel kelompok untuk detail. Prinsip penggerak semuanya satu: hampir tidak ada yang benar-benar hilang selama objeknya masih di database Git (git reflog ).

Membatalkan Sebelum Commit #

Perubahan yang belum di-commit dibatalkan dari tempatnya berada: suntingan di working tree dikembalikan lewat restore, berkas yang sudah masuk staging ditarik keluar dengan --staged, dan berkas untracked disapu dengan clean (Membuang Perubahan Lokal , Membatalkan Staging ).

PerintahFungsiContoh
git restore <berkas>Membuang suntingan working tree, kembali ke isi index.git restore catatan-rilis.md
git restore --staged <berkas>Menarik berkas keluar dari staging area tanpa menyentuh suntingannya.git restore --staged README.md
git restore --source=<titik> <berkas>Mengambil isi berkas dari titik riwayat mana pun ke working tree (Memulihkan File ).git restore --source=b38bfe9 catatan-rilis.md
git clean -nMelihat daftar berkas untracked yang akan disapu — dry run.git clean -n
git clean -fMenyapu berkas untracked, tanpa jalur undo (Membersihkan Repository ).git clean -f

Membatalkan Commit #

Dua keluarga besar hidup berdampingan di sini: reset dan amend menulis ulang riwayat, revert menambah commit pembalik. Batas pemakainya ditentukan satu pertanyaan — apakah commit sudah dibagikan ke remote — dan dibahas tuntas di Revert vs Reset .

PerintahFungsiContoh
git commit --amendMenulis ulang commit terakhir — pesan, isi, atau keduanya (Amend Commit ).git commit --amend -m "Tambah gula ke daftar belanja"
git commit --amend --no-editMenulis ulang commit terakhir dengan pesan lama.git commit --amend --no-edit
git reset --soft HEAD~2Menarik HEAD mundur; seluruh perubahan menumpuk di staging area (Reset Soft, Mixed, dan Hard ).git reset --soft HEAD~2
git resetMelepas seluruh staging tanpa memindahkan HEAD — mode --mixed.git reset
git reset --hard HEAD~1Menarik HEAD mundur sekaligus menimpa staging dan working tree.git reset --hard HEAD~1
git reset --hard origin/mainMenyeret branch lokal ke posisi terbaru remote.git reset --hard origin/main
git reset --hard ORIG_HEADKembali ke posisi sebelum operasi berbahaya terakhir — merge, reset, atau rebase (Membatalkan Merge ).git reset --hard ORIG_HEAD
git revert <hash>Membuat commit baru yang membalik perubahan commit sasaran (Revert ).git revert ca0268f
git revert -m 1 <hash-merge>Membalik sebuah commit merge dengan memilih jalur parent utama.git revert -m 1 b614292

Menyelamatkan yang Hilang #

Stash memindahkan pekerjaan setengah jadi ke tempat aman, reflog merekam semua posisi HEAD, dan fsck --lost-found memindai objek yang kehilangan penunjuk — tiga lapis jaring pengaman yang saling melengkapi (git stash , Prosedur Recovery Aman ).

PerintahFungsiContoh
git stashMenyimpan seluruh perubahan tracked ke tumpukan simpanan sementara.git stash
git stash push -u -m "<pesan>"Menyimpan termasuk berkas untracked, dengan pesan pengingat.git stash push -u -m "bawa catatan liar"
git stash listMendaftar seluruh simpanan di tumpukan.git stash list
git stash popMengambil simpanan teratas lalu menjatuhkannya dari tumpukan.git stash pop
git stash applyMengambil simpanan tanpa menjatuhkannya (Stash Apply, Pop, dan Drop ).git stash apply
git stash dropMembuang satu simpanan dari tumpukan.git stash drop
git stash branch <nama>Melanjutkan simpanan pada branch baru yang berdiri di titik kelahirannya (Stash Branch ).git stash branch fitur-lanjutan "stash@{0}"
git reflogMembaca catatan semua posisi yang pernah diduduki HEAD.git reflog
git branch <nama> <hash>Membangkitkan branch baru pada commit yang penunjuknya hilang (Memulihkan Branch Terhapus ).git branch fitur HEAD@{2}
git fsck --lost-foundMemindai objek tak terjangkau dan menjatuhkannya ke .git/lost-found/.git fsck --lost-found

Tabel Keputusan Cepat #

Kecelakaan paling umum dan pintu keluarnya — masing-masing dirinci di chapter teori yang dirujuk tabel-tabel di atas.

SituasiPerintah
Suntingan salah, belum di-git addgit restore <berkas>
Sudah masuk staging, belum commitgit restore --staged <berkas>
Commit terakhir salah pesan atau isinya, belum dipushgit commit --amend
Beberapa commit terakhir mau dilebur jadi satu, belum dipushgit reset --soft HEAD~<n> lalu commit ulang
Commit bermasalah sudah dipush dan dibagikangit revert <hash>
Merge salah arah, belum ter-commitgit merge --abort
Merge sudah ter-commit, belum dibagikangit reset --hard ORIG_HEAD
Branch terhapus tanpa sengajagit reflog, lalu git branch <nama> <hash>
Commit hilang tanpa jejak refloggit fsck --lost-found
Berkas terhapus di working treegit restore <berkas> (Memulihkan File Terhapus )
Butuh isi berkas dari versi lamagit restore --source=<titik> <berkas>

Sebelum membatalkan apa pun, langkah pertama yang selalu benar justru melihat: perubahan mana yang sebenarnya terjadi dan kapan ia masuk. Perintah pemeriksaan untuk itu — diff dan seluruh ragam filter log — dirangkum di Perintah Diff dan Log .