How does git bisect help you find a bug-introducing commit?
Learn how git bisect uses binary search to pinpoint the commit that introduced a bug, with manual and automated 'git bisect run' examples and interview tips.
Expected Interview Answer
git bisect performs an automated binary search through your commit history to pinpoint the exact commit that introduced a bug, testing a logarithmic number of commits instead of every one.
You mark one commit as 'bad' (bug present) and an earlier one as 'good' (bug absent). Git checks out the midpoint commit, you test it and tell git whether it is good or bad, and git repeatedly halves the remaining range until only the first bad commit is left. For N commits it needs only about log2(N) tests, and with 'git bisect run <script>' the whole search can be fully automated.
- Finds the culprit in log2(N) steps instead of N
- Works even when you have no idea which area of code broke
- Can be fully automated with a test script via 'git bisect run'
- Objective and repeatable — no guessing based on intuition
- Pinpoints the exact commit, author and diff responsible
AI Mentor Explanation
Suppose a batter's average quietly collapsed somewhere across a 64-match season and you must find the exact match it started. Rather than replay all 64 innings, you check match 32: still scoring well, so the rot began later. You jump to match 48, then 40, each time halving the span, until one match reveals the first bad innings. git bisect searches commits with this same halving discipline instead of replaying every game.
Step-by-Step Explanation
Step 1
Start the session
Run 'git bisect start' to begin a bisect session on the current branch.
Step 2
Mark the bad commit
Run 'git bisect bad' on a commit where the bug is present, usually HEAD.
Step 3
Mark a good commit
Run 'git bisect good <sha>' on an older commit known to work correctly.
Step 4
Test the midpoint
Git checks out the middle commit; test it and mark it 'git bisect good' or 'git bisect bad'.
Step 5
Repeat until found
Git keeps halving the range and reports the first bad commit's SHA when done.
Step 6
Reset
Run 'git bisect reset' to return to your original HEAD and end the session.
What Interviewer Expects
- Understanding that bisect is a binary search over commits
- Correct 'good' and 'bad' marking workflow
- Awareness of log2(N) efficiency vs linear checking
- Knowledge of 'git bisect run' for automation
- Remembering to 'git bisect reset' at the end
Common Mistakes
- Marking the bad commit as good or vice versa, inverting the search
- Forgetting to run 'git bisect reset' and leaving a detached HEAD
- Choosing a 'good' commit that actually already contains the bug
- Not writing a reliable test, so results are inconsistent
- Testing manually when a script could automate the whole search
Best Answer (HR Friendly)
“git bisect is a tool that finds which change first introduced a bug by cleverly checking the middle of your project's history, then narrowing down by half each time. It turns hunting through hundreds of changes into just a handful of checks.”
Code Example
git bisect start
git bisect bad HEAD
git bisect good v1.4.0
# git checks out a midpoint commit; test it, then:
git bisect good # or: git bisect bad
# repeat until git prints the first bad commit
git bisect resetgit bisect start HEAD v1.4.0
git bisect run npm test
# git runs the test on each midpoint automatically
# exit code 0 = good, non-zero = bad
git bisect resetFollow-up Questions
- How does 'git bisect run' interpret a script's exit codes?
- What exit code should a test return to mark a commit as skippable?
- How is git bisect more efficient than checking each commit linearly?
- Can you bisect when some commits fail to build? What is 'git bisect skip'?
- How would you bisect a bug that only reproduces intermittently?
MCQ Practice
1. What search algorithm does git bisect use?
git bisect halves the range of suspect commits on each step, which is a binary search over history.
2. In 'git bisect run <cmd>', what does a non-zero exit code mean?
A non-zero exit code (other than 125) marks the commit as bad; exit 0 marks it good and 125 marks it skip.
3. Which command ends a bisect session and restores your original HEAD?
'git bisect reset' terminates the session and returns you to the branch and commit you started from.
Flash Cards
What problem does git bisect solve? — It finds the exact commit that introduced a bug using binary search over history.
How many tests for N commits? — About log2(N) — e.g. only ~10 tests for 1000 commits.
How do you automate bisect? — 'git bisect run <script>' — exit 0 = good, non-zero = bad, 125 = skip.
How do you finish a bisect session? — Run 'git bisect reset' to restore your original HEAD.