blob: ab60a1847042a8ef28e019c8ad1a620ef5fd41d7 [file] [log] [blame]
Junio C Hamano1a4e8412005-12-27 08:17:231git-bisect(1)
2=============
3
4NAME
5----
Junio C Hamanofd83b8e2009-03-22 08:21:416git-bisect - Find by binary search the change that introduced a bug
Junio C Hamano1a4e8412005-12-27 08:17:237
8
9SYNOPSIS
10--------
Junio C Hamano15567bc2011-07-23 00:51:5911[verse]
Junio C Hamanoa77a5132007-06-08 16:13:4412'git bisect' <subcommand> <options>
Junio C Hamano1a4e8412005-12-27 08:17:2313
14DESCRIPTION
15-----------
Junio C Hamanob60308a2007-03-24 07:16:4216The command takes various subcommands, and different options depending
17on the subcommand:
Junio C Hamano1a4e8412005-12-27 08:17:2318
Junio C Hamanoe79159d2008-04-12 08:23:1719 git bisect help
Junio C Hamano12a3a232007-04-07 10:18:1020 git bisect start [<bad> [<good>...]] [--] [<paths>...]
Junio C Hamano1974bf22007-10-31 05:57:2021 git bisect bad [<rev>]
22 git bisect good [<rev>...]
Junio C Hamanod796cea2008-12-03 03:51:1023 git bisect skip [(<rev>|<range>)...]
Junio C Hamanoc21ab052009-10-31 04:03:5524 git bisect reset [<commit>]
Junio C Hamano1a4e8412005-12-27 08:17:2325 git bisect visualize
26 git bisect replay <logfile>
27 git bisect log
Junio C Hamanof440a232007-03-23 10:46:1728 git bisect run <cmd>...
Junio C Hamano1a4e8412005-12-27 08:17:2329
Junio C Hamano175a1bd2008-11-10 00:08:5730This command uses 'git rev-list --bisect' to help drive the
Junio C Hamanob60308a2007-03-24 07:16:4231binary search process to find which change introduced a bug, given an
32old "good" commit object name and a later "bad" commit object name.
33
Junio C Hamanoe79159d2008-04-12 08:23:1734Getting help
35~~~~~~~~~~~~
36
37Use "git bisect" to get a short usage description, and "git bisect
38help" or "git bisect -h" to get a long usage description.
39
Junio C Hamanob60308a2007-03-24 07:16:4240Basic bisect commands: start, bad, good
41~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Junio C Hamano1a4e8412005-12-27 08:17:2342
Junio C Hamanofd83b8e2009-03-22 08:21:4143Using the Linux kernel tree as an example, basic use of the bisect
44command is as follows:
Junio C Hamano1a4e8412005-12-27 08:17:2345
46------------------------------------------------
47$ git bisect start
Junio C Hamanob60308a2007-03-24 07:16:4248$ git bisect bad # Current version is bad
49$ git bisect good v2.6.13-rc2 # v2.6.13-rc2 was the last version
50 # tested that was good
Junio C Hamano1a4e8412005-12-27 08:17:2351------------------------------------------------
52
Junio C Hamanofd83b8e2009-03-22 08:21:4153When you have specified at least one bad and one good version, the
54command bisects the revision tree and outputs something similar to
55the following:
Junio C Hamano1a4e8412005-12-27 08:17:2356
57------------------------------------------------
58Bisecting: 675 revisions left to test after this
59------------------------------------------------
60
Junio C Hamanofd83b8e2009-03-22 08:21:4161The state in the middle of the set of revisions is then checked out.
62You would now compile that kernel and boot it. If the booted kernel
63works correctly, you would then issue the following command:
Junio C Hamano1a4e8412005-12-27 08:17:2364
65------------------------------------------------
66$ git bisect good # this one is good
67------------------------------------------------
68
Junio C Hamanofd83b8e2009-03-22 08:21:4169The output of this command would be something similar to the following:
Junio C Hamano1a4e8412005-12-27 08:17:2370
71------------------------------------------------
72Bisecting: 337 revisions left to test after this
73------------------------------------------------
74
Junio C Hamanofd83b8e2009-03-22 08:21:4175You keep repeating this process, compiling the tree, testing it, and
76depending on whether it is good or bad issuing the command "git bisect good"
77or "git bisect bad" to ask for the next bisection.
Junio C Hamano1a4e8412005-12-27 08:17:2378
Junio C Hamanofd83b8e2009-03-22 08:21:4179Eventually there will be no more revisions left to bisect, and you
80will have been left with the first bad kernel revision in "refs/bisect/bad".
Junio C Hamanob60308a2007-03-24 07:16:4281
82Bisect reset
83~~~~~~~~~~~~
Junio C Hamano1a4e8412005-12-27 08:17:2384
Junio C Hamanoc21ab052009-10-31 04:03:5585After a bisect session, to clean up the bisection state and return to
86the original HEAD, issue the following command:
Junio C Hamano1a4e8412005-12-27 08:17:2387
88------------------------------------------------
89$ git bisect reset
90------------------------------------------------
91
Junio C Hamanoc21ab052009-10-31 04:03:5592By default, this will return your tree to the commit that was checked
93out before `git bisect start`. (A new `git bisect start` will also do
94that, as it cleans up the old bisection state.)
95
96With an optional argument, you can return to a different commit
97instead:
98
99------------------------------------------------
100$ git bisect reset <commit>
101------------------------------------------------
102
103For example, `git bisect reset HEAD` will leave you on the current
104bisection commit and avoid switching commits at all, while `git bisect
105reset bisect/bad` will check out the first bad revision.
Junio C Hamanob60308a2007-03-24 07:16:42106
107Bisect visualize
108~~~~~~~~~~~~~~~~
Junio C Hamano1a4e8412005-12-27 08:17:23109
Junio C Hamano1de75722009-03-26 08:39:38110To see the currently remaining suspects in 'gitk', issue the following
111command during the bisection process:
Junio C Hamano1a4e8412005-12-27 08:17:23112
113------------
114$ git bisect visualize
115------------
116
Junio C Hamanofd83b8e2009-03-22 08:21:41117`view` may also be used as a synonym for `visualize`.
Junio C Hamano942b35e2007-12-09 10:19:33118
Junio C Hamanofd83b8e2009-03-22 08:21:41119If the 'DISPLAY' environment variable is not set, 'git log' is used
120instead. You can also give command line options such as `-p` and
Junio C Hamano942b35e2007-12-09 10:19:33121`--stat`.
122
123------------
124$ git bisect view --stat
125------------
Junio C Hamano1a4e8412005-12-27 08:17:23126
Junio C Hamanob60308a2007-03-24 07:16:42127Bisect log and bisect replay
128~~~~~~~~~~~~~~~~~~~~~~~~~~~~
129
Junio C Hamano1de75722009-03-26 08:39:38130After having marked revisions as good or bad, issue the following
Junio C Hamanofd83b8e2009-03-22 08:21:41131command to show what has been done so far:
Junio C Hamanob60308a2007-03-24 07:16:42132
133------------
134$ git bisect log
135------------
136
Junio C Hamanofd83b8e2009-03-22 08:21:41137If you discover that you made a mistake in specifying the status of a
138revision, you can save the output of this command to a file, edit it to
139remove the incorrect entries, and then issue the following commands to
140return to a corrected state:
Junio C Hamano1a4e8412005-12-27 08:17:23141
142------------
Junio C Hamanofd83b8e2009-03-22 08:21:41143$ git bisect reset
Junio C Hamano1a4e8412005-12-27 08:17:23144$ git bisect replay that-file
145------------
146
Junio C Hamanofd83b8e2009-03-22 08:21:41147Avoiding testing a commit
Junio C Hamanob60308a2007-03-24 07:16:42148~~~~~~~~~~~~~~~~~~~~~~~~~
149
Junio C Hamano1de75722009-03-26 08:39:38150If, in the middle of a bisect session, you know that the next suggested
Junio C Hamanofd83b8e2009-03-22 08:21:41151revision is not a good one to test (e.g. the change the commit
Junio C Hamanob60308a2007-03-24 07:16:42152introduces is known not to work in your environment and you know it
153does not have anything to do with the bug you are chasing), you may
Junio C Hamanofd83b8e2009-03-22 08:21:41154want to find a nearby commit and try that instead.
Junio C Hamanob60308a2007-03-24 07:16:42155
Junio C Hamanofd83b8e2009-03-22 08:21:41156For example:
Junio C Hamano1a4e8412005-12-27 08:17:23157
158------------
Junio C Hamanofd83b8e2009-03-22 08:21:41159$ git bisect good/bad # previous round was good or bad.
Junio C Hamano1a4e8412005-12-27 08:17:23160Bisecting: 337 revisions left to test after this
161$ git bisect visualize # oops, that is uninteresting.
Junio C Hamanofd83b8e2009-03-22 08:21:41162$ git reset --hard HEAD~3 # try 3 revisions before what
Junio C Hamano1a4e8412005-12-27 08:17:23163# was suggested
164------------
165
Junio C Hamano1de75722009-03-26 08:39:38166Then compile and test the chosen revision, and afterwards mark
167the revision as good or bad in the usual manner.
Junio C Hamano1a4e8412005-12-27 08:17:23168
Junio C Hamano1974bf22007-10-31 05:57:20169Bisect skip
170~~~~~~~~~~~~
171
Junio C Hamanofd83b8e2009-03-22 08:21:41172Instead of choosing by yourself a nearby commit, you can ask git
173to do it for you by issuing the command:
Junio C Hamano1974bf22007-10-31 05:57:20174
175------------
176$ git bisect skip # Current version cannot be tested
177------------
178
Junio C Hamano2c14c8d2009-07-02 03:17:00179But git may eventually be unable to tell the first bad commit among
180a bad commit and one or more skipped commits.
Junio C Hamano1974bf22007-10-31 05:57:20181
Junio C Hamanod796cea2008-12-03 03:51:10182You can even skip a range of commits, instead of just one commit,
183using the "'<commit1>'..'<commit2>'" notation. For example:
184
185------------
186$ git bisect skip v2.5..v2.6
187------------
188
Junio C Hamano1de75722009-03-26 08:39:38189This tells the bisect process that no commit after `v2.5`, up to and
190including `v2.6`, should be tested.
Junio C Hamanod796cea2008-12-03 03:51:10191
Junio C Hamanofd83b8e2009-03-22 08:21:41192Note that if you also want to skip the first commit of the range you
193would issue the command:
Junio C Hamanod796cea2008-12-03 03:51:10194
195------------
196$ git bisect skip v2.5 v2.5..v2.6
197------------
198
Junio C Hamano1de75722009-03-26 08:39:38199This tells the bisect process that the commits between `v2.5` included
200and `v2.6` included should be skipped.
Junio C Hamanofd83b8e2009-03-22 08:21:41201
Junio C Hamanod796cea2008-12-03 03:51:10202
Junio C Hamano12a3a232007-04-07 10:18:10203Cutting down bisection by giving more parameters to bisect start
204~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Junio C Hamanob60308a2007-03-24 07:16:42205
Junio C Hamanofd83b8e2009-03-22 08:21:41206You can further cut down the number of trials, if you know what part of
207the tree is involved in the problem you are tracking down, by specifying
208path parameters when issuing the `bisect start` command:
Junio C Hamano1a4e8412005-12-27 08:17:23209
210------------
Junio C Hamano12a3a232007-04-07 10:18:10211$ git bisect start -- arch/i386 include/asm-i386
212------------
213
Junio C Hamanofd83b8e2009-03-22 08:21:41214If you know beforehand more than one good commit, you can narrow the
215bisect space down by specifying all of the good commits immediately after
216the bad commit when issuing the `bisect start` command:
Junio C Hamano12a3a232007-04-07 10:18:10217
218------------
219$ git bisect start v2.6.20-rc6 v2.6.20-rc4 v2.6.20-rc1 --
220 # v2.6.20-rc6 is bad
221 # v2.6.20-rc4 and v2.6.20-rc1 are good
Junio C Hamano1a4e8412005-12-27 08:17:23222------------
223
Junio C Hamanob60308a2007-03-24 07:16:42224Bisect run
225~~~~~~~~~~
226
227If you have a script that can tell if the current source code is good
Junio C Hamanofd83b8e2009-03-22 08:21:41228or bad, you can bisect by issuing the command:
Junio C Hamanof440a232007-03-23 10:46:17229
230------------
Junio C Hamano0a235222009-03-06 08:21:09231$ git bisect run my_script arguments
Junio C Hamanof440a232007-03-23 10:46:17232------------
233
Junio C Hamanofd83b8e2009-03-22 08:21:41234Note that the script (`my_script` in the above example) should
235exit with code 0 if the current source code is good, and exit with a
Junio C Hamano1974bf22007-10-31 05:57:20236code between 1 and 127 (inclusive), except 125, if the current
237source code is bad.
Junio C Hamanof440a232007-03-23 10:46:17238
Junio C Hamanofd83b8e2009-03-22 08:21:41239Any other exit code will abort the bisect process. It should be noted
240that a program that terminates via "exit(-1)" leaves $? = 255, (see the
241exit(3) manual page), as the value is chopped with "& 0377".
Junio C Hamanof440a232007-03-23 10:46:17242
Junio C Hamano1974bf22007-10-31 05:57:20243The special exit code 125 should be used when the current source code
Junio C Hamanofd83b8e2009-03-22 08:21:41244cannot be tested. If the script exits with this code, the current
Junio C Hamanod2c978f2011-03-20 19:42:22245revision will be skipped (see `git bisect skip` above). 125 was chosen
246as the highest sensible value to use for this purpose, because 126 and 127
247are used by POSIX shells to signal specific error status (127 is for
248command not found, 126 is for command found but not executable---these
249details do not matter, as they are normal errors in the script, as far as
250"bisect run" is concerned).
Junio C Hamano1974bf22007-10-31 05:57:20251
Junio C Hamanofd83b8e2009-03-22 08:21:41252You may often find that during a bisect session you want to have
253temporary modifications (e.g. s/#define DEBUG 0/#define DEBUG 1/ in a
254header file, or "revision that does not have this commit needs this
255patch applied to work around another problem this bisection is not
256interested in") applied to the revision being tested.
Junio C Hamanof440a232007-03-23 10:46:17257
Junio C Hamano175a1bd2008-11-10 00:08:57258To cope with such a situation, after the inner 'git bisect' finds the
Junio C Hamanofd83b8e2009-03-22 08:21:41259next revision to test, the script can apply the patch
260before compiling, run the real test, and afterwards decide if the
261revision (possibly with the needed patch) passed the test and then
262rewind the tree to the pristine state. Finally the script should exit
263with the status of the real test to let the "git bisect run" command loop
264determine the eventual outcome of the bisect session.
Junio C Hamano1a4e8412005-12-27 08:17:23265
Junio C Hamano6d76d612008-05-09 05:46:08266EXAMPLES
267--------
268
269* Automatically bisect a broken build between v1.2 and HEAD:
270+
271------------
272$ git bisect start HEAD v1.2 -- # HEAD is bad, v1.2 is good
273$ git bisect run make # "make" builds the app
274------------
275
Junio C Hamano0a235222009-03-06 08:21:09276* Automatically bisect a test failure between origin and HEAD:
277+
278------------
279$ git bisect start HEAD origin -- # HEAD is bad, origin is good
280$ git bisect run make test # "make test" builds and tests
281------------
282
Junio C Hamano6d76d612008-05-09 05:46:08283* Automatically bisect a broken test case:
284+
285------------
286$ cat ~/test.sh
287#!/bin/sh
Junio C Hamanofd83b8e2009-03-22 08:21:41288make || exit 125 # this skips broken builds
Junio C Hamano9a2fb2d2011-03-23 05:40:15289~/check_test_case.sh # does the test case pass?
Junio C Hamano6d76d612008-05-09 05:46:08290$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10
291$ git bisect run ~/test.sh
292------------
293+
Junio C Hamano9a2fb2d2011-03-23 05:40:15294Here we use a "test.sh" custom script. In this script, if "make"
295fails, we skip the current commit.
296"check_test_case.sh" should "exit 0" if the test case passes,
Junio C Hamanofd83b8e2009-03-22 08:21:41297and "exit 1" otherwise.
Junio C Hamano6d76d612008-05-09 05:46:08298+
Junio C Hamano9a2fb2d2011-03-23 05:40:15299It is safer if both "test.sh" and "check_test_case.sh" are
Junio C Hamanofd83b8e2009-03-22 08:21:41300outside the repository to prevent interactions between the bisect,
301make and test processes and the scripts.
Junio C Hamano6d76d612008-05-09 05:46:08302
Junio C Hamano9a2fb2d2011-03-23 05:40:15303* Automatically bisect with temporary modifications (hot-fix):
304+
305------------
306$ cat ~/test.sh
307#!/bin/sh
308
309# tweak the working tree by merging the hot-fix branch
310# and then attempt a build
311if git merge --no-commit hot-fix &&
312make
313then
314# run project specific test and report its status
315~/check_test_case.sh
316status=$?
317else
318# tell the caller this is untestable
319status=125
320fi
321
322# undo the tweak to allow clean flipping to the next commit
323git reset --hard
324
325# return control
326exit $status
327------------
328+
329This applies modifications from a hot-fix branch before each test run,
330e.g. in case your build or test environment changed so that older
331revisions may need a fix which newer ones have already. (Make sure the
332hot-fix branch is based off a commit which is contained in all revisions
333which you are bisecting, so that the merge does not pull in too much, or
334use `git cherry-pick` instead of `git merge`.)
335
336* Automatically bisect a broken test case:
Junio C Hamano0a235222009-03-06 08:21:09337+
338------------
339$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10
340$ git bisect run sh -c "make || exit 125; ~/check_test_case.sh"
341------------
342+
Junio C Hamano9a2fb2d2011-03-23 05:40:15343This shows that you can do without a run script if you write the test
344on a single line.
Junio C Hamano0a235222009-03-06 08:21:09345
Junio C Hamano2bd8a742009-12-01 21:16:59346SEE ALSO
347--------
348link:git-bisect-lk2009.html[Fighting regressions with git bisect],
349linkgit:git-blame[1].
350
Junio C Hamano1a4e8412005-12-27 08:17:23351GIT
352---
Junio C Hamanof7c042d2008-06-06 22:50:53353Part of the linkgit:git[1] suite