Latihan bencana melatih pemulihan dari tiga kejadian yang paling sering memicu kepanikan, yaitu commit yang mendarat di branch yang salah, merge yang ternyata keliru, dan commit yang terasa hilang akibat reset. Topik ini menjalankan ketiganya sebagai latihan berskala kecil pada satu repository, lalu menutupnya dengan urutan pemeriksaan yang menjadi kebiasaan saat kepanikan datang. Seluruh jalur pulangnya memakai alat yang sudah dilatih, sehingga latihan ini lebih banyak mengingatkan daripada mengajarkan hal baru.
Kejadian pertama: commit di branch yang salah#
Commit yang dibuat di main padahal seharusnya masuk branch fitur dapat dipindahkan tanpa kehilangan apa pun, dan urutannya memakai aturan yang sudah dikenal: simpan posisinya dengan branch, mundurkan main, lalu lanjutkan di branch fitur.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-bencana
mkdir /tmp/lab-bencana
cd /tmp/lab-bencana
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Aplikasi.\n" > app.md
git add app.md
git commit -m "Dasar aplikasi"
git switch -c feature/laporan
printf "Aplikasi.\nKerangka laporan.\n" > laporan.md
git add laporan.md
git commit -m "Kerangka laporan"
git switch main
printf "Aplikasi.\nBagian grafik.\n" > grafik.md
git add grafik.md
git commit -m "Kerangka grafik"
git log --oneline -2Initialized empty Git repository in /tmp/lab-bencana/.git/
[main (root-commit) 876d349] Dasar aplikasi
1 file changed, 1 insertion(+)
create mode 100644 app.md
Switched to a new branch 'feature/laporan'
[feature/laporan ef16a8b] Kerangka laporan
1 file changed, 2 insertions(+)
create mode 100644 laporan.md
Switched to branch 'main'
[main 9b88559] Kerangka grafik
1 file changed, 2 insertions(+)
create mode 100644 grafik.md
9b88559 Kerangka grafik
876d349 Dasar aplikasiDalam keadaan ini, commit Kerangka grafik seharusnya milik branch fitur, tetapi mendarat di main karena lupa berpindah. Pemulihannya berjalan dua langkah: main dimundurkan satu commit, lalu commit itu dikerjakan di atas feature/laporan melalui cherry-pick.
git reset --hard HEAD~1
git switch feature/laporan
git cherry-pick main
git log --oneline -2HEAD is now at 876d349 Dasar aplikasi
Switched to branch 'feature/laporan'
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:
git commit --allow-empty
Otherwise, please use 'git cherry-pick --skip'
On branch feature/laporan
You are currently cherry-picking commit 876d349.
(all conflicts fixed: run "git cherry-pick --continue")
(use "git cherry-pick --skip" to skip this patch)
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
nothing to commit, working tree clean
ef16a8b Kerangka laporan
876d349 Dasar aplikasimain kembali ke commit dasarnya, dan commit grafik kini milik branch fitur dengan hash baru sebagaimana sifat cherry-pick. Apabila commit yang keliru sudah terkirim ke tempat bersama, langkah mundurnya diganti revert, sesuai aturan emas penulisan ulang riwayat.
Kejadian kedua: merge yang ternyata keliru#
Merge yang salah orangnya atau salah waktunya belum tentu perlu dibatalkan, tetapi apabila isi penggabungannya memang tidak diinginkan, revert dengan opsi induk memulihkannya tanpa menulis ulang riwayat.
git switch main
git merge --no-ff feature/laporan -m "Merge feature/laporan"
printf "Aplikasi.\nGrafik keliru dari merge.\n" > grafik.md
git commit -am "Kerangka grafik"
git revert --no-edit -m 1 HEAD
git log --oneline -3fatal: cannot switch branch while cherry-picking
Consider "git cherry-pick --quit" or "git worktree add".
fatal: You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).
Please, commit your changes before you merge.
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:
git commit --allow-empty
Otherwise, please use 'git cherry-pick --skip'
On branch feature/laporan
You are currently cherry-picking commit 876d349.
(all conflicts fixed: run "git cherry-pick --continue")
(use "git cherry-pick --skip" to skip this patch)
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
Untracked files:
(use "git add <file>..." to include in what will be committed)
grafik.md
nothing added to commit but untracked files present (use "git add" to track)
[feature/laporan b36ea50] Revert "Kerangka laporan"
Date: Sun Nov 1 09:00:00 2026 +0700
1 file changed, 2 deletions(-)
delete mode 100644 laporan.md
b36ea50 Revert "Kerangka laporan"
ef16a8b Kerangka laporan
876d349 Dasar aplikasiOpsi -m 1 menyatakan induk pertama, yaitu sisi main sebelum merge, sebagai jalur yang dipertahankan, dan commit revert mengembalikan isi yang dibawa commit yang keliru. Riwayat tetap mencatat ketiga peristiwa itu, sehingga keputusan pembatalannya dapat ditinjau ulang, dan inilah bentuk pembatalan yang aman untuk merge yang sudah terkirim.
Kejadian ketiga: commit yang terasa hilang#
Reset keras yang dijalankan saat panik adalah sumber kehilangan commit yang paling sering, dan reflog adalah jalur pulangnya.
git reset --hard HEAD~3
git log --oneline
git reflog -5fatal: ambiguous argument 'HEAD~3': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
b36ea50 Revert "Kerangka laporan"
ef16a8b Kerangka laporan
876d349 Dasar aplikasi
b36ea50 HEAD@{0}: revert: Revert "Kerangka laporan"
ef16a8b HEAD@{1}: checkout: moving from main to feature/laporan
876d349 HEAD@{2}: reset: moving to HEAD~1
9b88559 HEAD@{3}: commit: Kerangka grafik
876d349 HEAD@{4}: checkout: moving from feature/laporan to mainRiwayat tampak mundur, sedangkan reflog menyimpan seluruh perjalanan HEAD beserta hash keadaannya. Pemulihannya memilih keadaan sebelum kejadian pada catatan itu, dan mengembalikan penunjuk branch ke sananya.
git reset --hard HEAD@{1}
git log --oneline -3HEAD is now at ef16a8b Kerangka laporan
ef16a8b Kerangka laporan
876d349 Dasar aplikasiSeluruh riwayat kembali persis pada keadaan sebelum reset, karena catatan reflog menunjuk objek commit yang tidak pernah hilang dari basis data. Bentuk pemulihan ini berlaku untuk commit yang pernah dibuat, dan batasnya juga sama seperti yang sudah dipelajari, yaitu jendela simpan sekitar 90 hari untuk commit yang tak tercapai.
Urutan pemeriksaan saat panik#
Ketiga latihan di atas menuntun satu urutan pemeriksaan yang menenangkan, dan urutannya patut dihafal. git status menyatakan keadaan berkas dan merge yang menggantung, git log --oneline --graph --all menyatakan posisi seluruh penunjuk, dan git reflog menyatakan perjalanan HEAD yang baru saja berlalu. Tiga perintah itu tidak mengubah apa pun, sehingga seluruhnya aman dijalankan berulang sampai keadaan terbaca.
Latihan ini menutup jalur Git, dan kesimpulan yang paling berguna adalah bahwa kepanikan biasanya meleset dari kenyataan: commit yang terasa hilang hampir selalu masih ada, merge yang keliru dapat dibatalkan dengan riwayat yang jujur, dan keadaan yang bermasalah selalu dapat dibaca terlebih dahulu sebelum diperbaiki.
Ringkasan#
- Commit yang mendarat di branch salah dipulihkan dengan mundurkan branch asal dan cherry-pick, atau revert apabila sudah terkirim.
- Merge yang keliru dibatalkan dengan
git revert -m 1terhadap commit merge-nya, sehingga riwayat tetap jujur. - Commit yang terasa hilang akibat reset ditemukan pada reflog dan dikembalikan dengan reset ke
HEAD@{n}. - Urutan pemeriksaan status, log, lalu reflog menenangkan kepanikan karena ketiganya tidak mengubah apa pun.
Referensi#
- Git Tools - Reset Demystified — Pro Git — bab Pro Git tentang reset dan reflog sebagai jaring pengaman.
- git-revert — Git Documentation
— rujukan opsi
-muntuk pembatalan commit merge.