cvsimport: move over to using git-for-each-ref to read refs.
[git.git] / Documentation / howto / isolate-bugs-with-bisect.txt
blob926bbdc3cb1dcab81e0d90de3a0b9b87153e55e6
1 From:   Linus Torvalds <torvalds () osdl ! org>
2 To:     git@vger.kernel.org
3 Date:   2005-11-08 1:31:34
4 Subject: Real-life kernel debugging scenario
5 Abstract: Short-n-sweet, Linus tells us how to leverage `git-bisect` to perform
6         bug isolation on a repository where "good" and "bad" revisions are known
7         in order to identify a suspect commit.
10 How To Use git-bisect To Isolate a Bogus Commit
11 ===============================================
13 The way to use "git bisect" couldn't be easier.
15 Figure out what the oldest bad state you know about is (that's usually the 
16 head of "master", since that's what you just tried to boot and failed at). 
17 Also, figure out the most recent known-good commit (usually the _previous_ 
18 kernel you ran: and if you've only done a single "pull" in between, it 
19 will be ORIG_HEAD).
21 Then do
23         git bisect start
24         git bisect bad master           <- mark "master" as the bad state
25         git bisect good ORIG_HEAD       <- mark ORIG_HEAD as good (or
26                                            whatever other known-good 
27                                            thing you booted last)
29 and at this point "git bisect" will churn for a while, and tell you what 
30 the mid-point between those two commits are, and check that state out as 
31 the head of the new "bisect" branch.
33 Compile and reboot.
35 If it's good, just do
37         git bisect good         <- mark current head as good
39 otherwise, reboot into a good kernel instead, and do (surprise surprise, 
40 git really is very intuitive):
42         git bisect bad          <- mark current head as bad
44 and whatever you do, git will select a new half-way point. Do this for a 
45 while, until git tells you exactly which commit was the first bad commit. 
46 That's your culprit.
48 It really works wonderfully well, except for the case where there was 
49 _another_ commit that broke something in between, like introduced some 
50 stupid compile error. In that case you should not mark that commit good or 
51 bad: you should try to find another commit close-by, and do a "git reset 
52 --hard <newcommit>" to try out _that_ commit instead, and then test that 
53 instead (and mark it good or bad).
55 You can do "git bisect visualize" while you do all this to see what's 
56 going on by starting up gitk on the bisection range.
58 Finally, once you've figured out exactly which commit was bad, you can 
59 then go back to the master branch, and try reverting just that commit:
61         git checkout master
62         git revert <bad-commit-id>
64 to verify that the top-of-kernel works with that single commit reverted.