Bisect, Cherry-Pick + Quiz 3.2
Tujuan Pembelajaran
- Mampu menggunakan git bisect untuk menemukan commit penyebab bug
- Memahami dan menggunakan git cherry-pick
- Menyelesaikan level LGB mixed1 dan mixed3
- Mengevaluasi pemahaman modul 3.2
Materi Inti
A. Git Bisect โ Binary Search untuk Bug
git bisect menggunakan algoritma binary search untuk menemukan commit pertama yang menyebabkan bug. Sangat berguna ketika ada ratusan commit antara versi yang masih berfungsi dan versi yang bermasalah.
# Mulai bisect
git bisect start
# Tandai commit saat ini sebagai "bad" (ada bug)
git bisect bad
# Tandai commit yang masih OK
git bisect good v1.0.0 # bisa pakai tag, hash, atau branch
# Git akan checkout ke commit di tengah-tengah
# Test apakah bug ada di sini, lalu tandai:
git bisect bad # jika bug masih ada
# atau
git bisect good # jika bug tidak ada
# Ulangi sampai Git menemukan commit penyebab bug
# Output: "abc123 is the first bad commit"
# Selesai, kembali ke branch semula
git bisect reset
Cara kerja Binary Search:
good -----*-----*-----*-----*-----*-----*-----* bad
^
Git cek di sini dulu
(setengah dari total commit)
Dengan 100 commit, binary search hanya butuh sekitar 7 langkah (log2 100), dibandingkan 100 langkah jika cek satu per satu.
Bisect otomatis dengan script:
# Jalankan bisect otomatis dengan test script
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
git bisect run npm test
# Git otomatis menjalankan test di setiap langkah!
B. Git Cherry-Pick โ Ambil Commit Tertentu
git cherry-pick mengambil satu atau beberapa commit spesifik dari branch lain dan menerapkannya ke branch saat ini. Ini membuat commit baru dengan perubahan yang sama.
# Ambil satu commit dari branch lain
git cherry-pick abc123
# Ambil beberapa commit sekaligus
git cherry-pick abc123 def456 ghi789
# Cherry-pick tanpa langsung commit
git cherry-pick --no-commit abc123
# Jika terjadi conflict saat cherry-pick
git cherry-pick --continue # setelah resolve conflict
git cherry-pick --abort # batalkan cherry-pick
Kapan menggunakan cherry-pick:
- Mengambil bugfix dari branch lain tanpa merge seluruh branch
- Memindahkan commit yang salah branch
- Backport fitur ke versi lama
Tips: Jangan terlalu sering menggunakan cherry-pick. Jika butuh banyak commit dari branch lain, merge atau rebase biasanya lebih tepat.
Demonstrasi Live
Demonstrasi Bisect
mkdir latihan-bisect && cd latihan-bisect && git init
# Buat 10 commit, bug diperkenalkan di commit ke-6
for i in $(seq 1 5); do
echo "fitur $i - OK" >> app.js
git add . && git commit -m "commit $i: fitur $i"
done
# Commit ke-6: introduce bug
echo "BUG_CODE" >> app.js
git add . && git commit -m "commit 6: tambah modul baru"
for i in $(seq 7 10); do
echo "fitur $i - OK" >> app.js
git add . && git commit -m "commit $i: fitur $i"
done
# Mulai bisect
git bisect start
git bisect bad # commit 10 (sekarang) ada bug
git bisect good HEAD~9 # commit 1 tidak ada bug
# Di setiap langkah, cek apakah ada "BUG_CODE"
grep -q "BUG_CODE" app.js && echo "BAD" || echo "GOOD"
# Tandai sesuai hasil: git bisect bad / git bisect good
git bisect reset
Demonstrasi Cherry-Pick
mkdir latihan-cherry && cd latihan-cherry && git init
echo "main" > main.txt && git add . && git commit -m "init main"
# Buat branch fitur dengan beberapa commit
git switch -c feature/banyak-fitur
echo "fitur A" > a.txt && git add . && git commit -m "feat: fitur A"
echo "fitur B" > b.txt && git add . && git commit -m "feat: fitur B"
echo "bugfix" > fix.txt && git add . && git commit -m "fix: perbaiki bug"
# Kembali ke main, ambil HANYA bugfix
git switch main
git log feature/banyak-fitur --oneline
# Catat hash dari commit "fix: perbaiki bug"
git cherry-pick <hash-bugfix>
git log --oneline
# Bugfix ada di main tanpa fitur A dan B
Latihan Interaktif
Latihan LGB (Learn Git Branching)
Level: โGrabbing Just 1 Commitโ (Mixed Bag - Level 1)
Ketik di LGB: level mixed1
Tantangan ini melatih kemampuan mengambil commit tertentu saja dari branch lain.
Level: โJuggling Commits #2โ (Mixed Bag - Level 3)
Ketik di LGB: level mixed3
Tantangan ini menggabungkan cherry-pick dengan amend untuk memodifikasi commit yang sudah ada.
Latihan Terminal
Buat skenario di mana kamu harus:
- Menemukan commit penyebab bug menggunakan
git bisect - Cherry-pick bugfix dari satu branch ke branch lain
- Kombinasikan kedua teknik: bisect untuk menemukan, cherry-pick untuk menerapkan fix
Tugas Mandiri
- Selesaikan LGB level
mixed1danmixed3 - Buat repository dengan 20+ commit, sengaja masukkan โbugโ di salah satu commit, lalu gunakan
git bisectuntuk menemukannya - Praktikkan cherry-pick: buat 2 branch dengan masing-masing 3 commit, lalu cherry-pick 1 commit spesifik antar branch
- Baca dokumentasi: https://git-scm.com/docs/git-bisect
Praktik Interaktif
Selesaikan level berikut untuk memperkuat pemahaman kamu.
Quiz: Review Modul 3.2
Jawab 10 pertanyaan berikut untuk menguji pemahaman kamu.
git reflog menampilkan...