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
).
| Perintah | Fungsi | Contoh |
|---|---|---|
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 -n | Melihat daftar berkas untracked yang akan disapu — dry run. | git clean -n |
git clean -f | Menyapu 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
.
| Perintah | Fungsi | Contoh |
|---|---|---|
git commit --amend | Menulis ulang commit terakhir — pesan, isi, atau keduanya (Amend Commit ). | git commit --amend -m "Tambah gula ke daftar belanja" |
git commit --amend --no-edit | Menulis ulang commit terakhir dengan pesan lama. | git commit --amend --no-edit |
git reset --soft HEAD~2 | Menarik HEAD mundur; seluruh perubahan menumpuk di staging area (Reset Soft, Mixed, dan Hard ). | git reset --soft HEAD~2 |
git reset | Melepas seluruh staging tanpa memindahkan HEAD — mode --mixed. | git reset |
git reset --hard HEAD~1 | Menarik HEAD mundur sekaligus menimpa staging dan working tree. | git reset --hard HEAD~1 |
git reset --hard origin/main | Menyeret branch lokal ke posisi terbaru remote. | git reset --hard origin/main |
git reset --hard ORIG_HEAD | Kembali 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
).
| Perintah | Fungsi | Contoh |
|---|---|---|
git stash | Menyimpan 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 list | Mendaftar seluruh simpanan di tumpukan. | git stash list |
git stash pop | Mengambil simpanan teratas lalu menjatuhkannya dari tumpukan. | git stash pop |
git stash apply | Mengambil simpanan tanpa menjatuhkannya (Stash Apply, Pop, dan Drop ). | git stash apply |
git stash drop | Membuang 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 reflog | Membaca 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-found | Memindai 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.
| Situasi | Perintah |
|---|---|
Suntingan salah, belum di-git add | git restore <berkas> |
| Sudah masuk staging, belum commit | git restore --staged <berkas> |
| Commit terakhir salah pesan atau isinya, belum dipush | git commit --amend |
| Beberapa commit terakhir mau dilebur jadi satu, belum dipush | git reset --soft HEAD~<n> lalu commit ulang |
| Commit bermasalah sudah dipush dan dibagikan | git revert <hash> |
| Merge salah arah, belum ter-commit | git merge --abort |
| Merge sudah ter-commit, belum dibagikan | git reset --hard ORIG_HEAD |
| Branch terhapus tanpa sengaja | git reflog, lalu git branch <nama> <hash> |
| Commit hilang tanpa jejak reflog | git fsck --lost-found |
| Berkas terhapus di working tree | git restore <berkas> (Memulihkan File Terhapus
) |
| Butuh isi berkas dari versi lama | git 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
.