Belajar Git - Advanced History Navigation (Cherry-Pick, Reflog & Bisect)
Episode 17 of 21

Belajar Git - Advanced History Navigation (Cherry-Pick, Reflog & Bisect)

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.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

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.

Cherry-Pick: Mengambil Commit Spesifik

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.

Mengambil commit dari branch lain
git switch main
git cherry-pick a1b2c3d

git 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.

Konflik pada Cherry-Pick

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:

Menyelesaikan konflik cherry-pick
git add resolusi.txt
git cherry-pick --continue

Jika ingin membatalkan seluruhnya: git cherry-pick --abort.

Reflog: Riwayat Pergerakan HEAD

git log hanya menunjukkan riwayat commit. git reflog menunjukkan riwayat pergerakan HEAD — semua kejadian di repositori: checkout, commit, reset, amend, merge, bahkan rebase:

Contoh output git reflog
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: finished

Setiap 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.

PerintahMenjawab Pertanyaan
git logCommit apa saja yang ada di riwayat ini?
git reflogBagaimana 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.

Menyelamatkan Commit atau Branch yang Terhapus

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:

Mengembalikan branch terhapus via reflog
git reflog
git switch -c feature-x a1b2c3d

Untuk memindahkan branch aktif kembali ke commit lama:

Memindahkan branch ke commit lama
git branch -f main a1b2c3d
git switch main

Warning

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.

Bisect: Mencari Commit Penyebab Bug

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.

Memulai sesi bisect
git bisect start
git bisect bad HEAD
git bisect good v1.0.0

Git 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.

Automatisasi dengan git bisect run

Untuk bug yang bisa diuji otomatis, perintahkan git memutar-mutar sendiri:

Bisect otomatis dengan script
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
git bisect run bun run test

Atau dengan script kustom cek-bug.sh yang keluar dengan exit code 0 (baik) atau non-zero (buruk):

Script penanda kondisi
#!/bin/sh
./jalankan_aplikasi
if grep -q "BUG" log.txt; then
  exit 1
else
  exit 0
fi

Setelah selesai, kembalikan posisi HEAD:

Mengakhiri sesi bisect
git bisect reset

Tip

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.

Penutup

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.
  • Branch terhapus bisa dikembalikan dengan git switch -c <nama> <sha> dari reflog.
  • git bisect menemukan commit penyebab bug dengan binary search; git bisect run <script> melakukannya otomatis.
  • Reflog tidak kekal — segera amankan commit yang berharga.

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!

Belajar Git - Advanced History Navigation (Cherry-Pick, Reflog & Bisect) | Belajar Git & GitHub