git bisect untuk Regresi — Debugging

Bug muncul, tapi dulu tidak ada. Di antara commit mana pecahnya? git bisect pakai binary search di history commit — cek commit di tengah, tanyakan "baik atau…

Bug muncul, tapi dulu tidak ada. Di antara commit mana pecahnya? git bisect pakai binary search di history commit — cek commit di tengah, tanyakan "baik atau rusak?", lanjut ke setengah yang tepat. 1024 commit jadi tinggal 10 langkah.

Alur dasar:

# 1. Mulai bisect
git bisect start

# 2. Tandai commit saat ini (yang bermasalah)
git bisect bad

# 3. Tandai commit lama yang kita tahu masih baik
git bisect good v2.1.0

# → Git akan checkout commit di tengah
# → Test fitur yang bermasalah

# 4. Jika commit ini rusak juga:
git bisect bad

# 5. Jika commit ini masih baik:
git bisect good

# ... ulangi sampai git menemukan first bad commit

Setelah selesai:

a1b2c3d is the first bad commit
commit a1b2c3d
Author: Siapa <[email protected]>
Date:   Wed Mar 1 14:00:00 2026 +0700
    refactor user validation

Langkah akhir:

git bisect reset   # kembali ke HEAD asli

Otomatisasi dengan script:

Jika ada test yang deterministik, git bisect run bisa otomatis:

git bisect start
git bisect bad
git bisect good v2.1.0
git bisect run npm test -- --filter="the broken feature"
# exit code 0 → good, 1-127 (kecuali 125) → bad, 125 → skip

Git akan checkout setiap commit, jalankan npm test, dan tentukan sendiri baik/buruk.

Contoh script kustom:

#!/bin/bash
# test.sh — return 0 jika commit baik, 1 jika buruk
npm run build
node -e "require('./dist/feature').work()" > /dev/null
exit $?
git bisect run ./test.sh

Edge cases:

1. Commit yang tidak bisa di-test (broken build):

git bisect skip   # lewati commit ini

2. Bug bergantung pada env eksternal: Pastikan env konsisten (DB state, env vars). Pakai Docker jika perlu.

3. Bug di test baru: git bisect kadang menunjuk commit yang menambah test, bukan commit yang memperkenalkan bug. Cek manual.

4. First bad commit adalah merge commit: Bug bisa dari salah satu parent. Jalankan git bisect di branch individual.

Workflow best practice:

  1. Minimal repro dulu — punya cara reproduce cepat (<30 detik), automated
  2. Scope sempit — mulai bisect dengan range kecil kalau bisa
  3. Dokumentasikan — catat commit hash yang salah + root cause untuk tim
  4. Fix + regression test — tambahkan test yang akan gagal tanpa fix

Contoh kalkulasi efisiensi:

Kombinasi dengan git log --oneline:

# Lihat range yang akan di-bisect
git log --oneline v2.1.0..HEAD | wc -l

# Bisect hanya di folder tertentu (lebih cepat kalau yakin lokal ke folder)
git bisect start -- src/auth/

Saat tidak pakai bisect: