Menjelajah dan menyelamatkan riwayat Git secara lanjutan: mengambil commit spesifik dengan git cherry-pick, memulihkan commit atau branch yang terhapus lewat git reflog, dan menemukan commit penyebab bug dengan git bisect.

Di episode 16 kita belajar menulis ulang riwayat dengan interactive rebase. Di episode 17 ini kita belajar membaca dan menyelamatkan riwayat: mengambil satu commit dari branch lain dengan git cherry-pick, memulihkan commit yang tampak hilang lewat git reflog, dan mencari commit penyebab bug secara otomatis dengan git bisect.
Kemampuan ini adalah penyelamat hidup di dunia nyata. Pernah menghapus branch secara tidak sengaja padahal ada kerjaan satu minggu di dalamnya? Atau bug muncul "tiba-tiba" dan tidak ada yang tahu mulai dari commit mana? Episode ini menjawab keduanya — sekaligus menegaskan satu fakta penting: Git hampir tidak pernah menghapus data secara permanen.
Kadang hanya satu commit dari sebuah branch yang kita butuhkan — bukan seluruh branch-nya. Contoh: hotfix fix: perbaiki bug login ada di branch feature/auth, tapi main juga butuh perbaikan itu saat ini juga.
git switch main
git cherry-pick a1b2c3dgit cherry-pick menyalin perubahan commit ke branch aktif sebagai commit baru dengan SHA baru — commit asli di branch lain tetap utuh. Ini jalan pintas untuk menyebarkan perbaikan penting tanpa perlu merge seluruh branch.
Jika perubahan yang disalin bentrok dengan file di branch tujuan, git berhenti dan memunculkan conflict marker (ingat episode 7). Selesaikan seperti konflik merge biasa, lalu lanjutkan:
git add resolusi.txt
git cherry-pick --continueJika ingin membatalkan seluruhnya: git cherry-pick --abort.
git log hanya menunjukkan riwayat commit. git reflog menunjukkan riwayat pergerakan HEAD — semua kejadian di repositori: checkout, commit, reset, amend, merge, bahkan rebase:
a1b2c3d HEAD@{0}: checkout: moving from feature-x to main
e4f5g6h HEAD@{1}: commit: fix: perbaiki validasi login
i7j8k9l HEAD@{2}: commit: feat: tambah halaman dashboard
f1f2f3f HEAD@{3}: reset: moving to f1f2f3f
c9c8c7c HEAD@{4}: rebase: finishedSetiap baris mencatat SHA commit tujuan, posisi HEAD saat itu, dan aksi yang memicunya. Inilah alasan commit yang di-reset atau branch yang dihapus masih bisa ditemukan: jejaknya tetap tersimpan di reflog.
| Perintah | Menjawab Pertanyaan |
|---|---|
git log | Commit apa saja yang ada di riwayat ini? |
git reflog | Bagaimana HEAD berpindah sampai di posisi sekarang? |
git show <sha> | Apa saja yang diubah oleh commit ini? |
Tip
Reflog secara default tersimpan sekitar 90 hari sebelum dibersihkan oleh garbage collection. Jika kehilangan commit, jangan panik dan jangan menunggu — cek reflog sesegera mungkin.
Contoh paling umum: git branch -D feature-x ternyata menghapus satu minggu kerja. Tenang, commit-nya masih hidup di reflog. Temukan SHA-nya, lalu buat ulang branch:
git reflog
git switch -c feature-x a1b2c3dUntuk memindahkan branch aktif kembali ke commit lama:
git branch -f main a1b2c3d
git switch mainWarning
Jangan pernah menggunakan git reset --hard <sha> di branch yang sudah di-push untuk "memutar waktu" — riwayat remote milik orang lain akan rusak. Reflog dan reset --hard hanya untuk riwayat lokal yang belum dibagikan.
Bug muncul entah sejak kapan. git bisect menemukannya dengan binary search: ia menandai setengah riwayat, memeriksa apakah bug ada di sana, lalu mempersempit sampai tersisa satu commit tersangka.
git bisect start
git bisect bad HEAD
git bisect good v1.0.0Git lalu men-checkout commit di tengah-tengah. Kalian uji: jika bug masih ada, tandai git bisect bad; jika bersih, tandai git bisect good. Setiap jawaban memangkas separuh kandidat. Beberapa langkah kemudian tersisa satu commit — itulah penyebabnya.
Untuk bug yang bisa diuji otomatis, perintahkan git memutar-mutar sendiri:
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
git bisect run bun run testAtau dengan script kustom cek-bug.sh yang keluar dengan exit code 0 (baik) atau non-zero (buruk):
#!/bin/sh
./jalankan_aplikasi
if grep -q "BUG" log.txt; then
exit 1
else
exit 0
fiSetelah selesai, kembalikan posisi HEAD:
git bisect resetTip
Kombinasikan ketiganya untuk alur penyelamatan lengkap: bisect menemukan commit pelaku, cherry-pick menyebarkan perbaikannya ke branch lain, dan reflog menyelamatkan apa pun yang terlanjur terhapus.
Poin yang harus kalian bawa:
git cherry-pick <hash> menyalin perubahan satu commit ke branch aktif sebagai commit baru.git reflog mencatat seluruh pergerakan HEAD — jalur darurat untuk menemukan commit yang di-reset, di-amend, atau dihapus.git switch -c <nama> <sha> dari reflog.git bisect menemukan commit penyebab bug dengan binary search; git bisect run <script> melakukannya otomatis.Histori kini bisa dirapikan dan dijelajahi. Saatnya membahas skala: bagaimana menggabungkan banyak repository dalam satu project. Di episode 18 berikutnya kita membahas Git Submodules & Subtrees untuk mengelola dependensi multi-repository. Sampai jumpa di episode 18!