1git-bisect(1) 2============= 3 4NAME 5---- 6git-bisect - Use binary search to find the commit that introduced a bug 7 8 9SYNOPSIS 10-------- 11[verse] 12'git bisect' <subcommand> <options> 13 14DESCRIPTION 15----------- 16The command takes various subcommands, and different options depending 17on the subcommand: 18 19 git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>] 20 [--no-checkout] [<bad> [<good>...]] [--] [<paths>...] 21 git bisect (bad|new|<term-new>) [<rev>] 22 git bisect (good|old|<term-old>) [<rev>...] 23 git bisect terms [--term-good | --term-bad] 24 git bisect skip [(<rev>|<range>)...] 25 git bisect reset [<commit>] 26 git bisect (visualize|view) 27 git bisect replay <logfile> 28 git bisect log 29 git bisect run <cmd>... 30 git bisect help 31 32This command uses a binary search algorithm to find which commit in 33your project's history introduced a bug. You use it by first telling 34it a "bad" commit that is known to contain the bug, and a "good" 35commit that is known to be before the bug was introduced. Then `git 36bisect` picks a commit between those two endpoints and asks you 37whether the selected commit is "good" or "bad". It continues narrowing 38down the range until it finds the exact commit that introduced the 39change. 40 41In fact, `git bisect` can be used to find the commit that changed 42*any* property of your project; e.g., the commit that fixed a bug, or 43the commit that caused a benchmark's performance to improve. To 44support this more general usage, the terms "old" and "new" can be used 45in place of "good" and "bad", or you can choose your own terms. See 46section "Alternate terms" below for more information. 47 48Basic bisect commands: start, bad, good 49~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 51As an example, suppose you are trying to find the commit that broke a 52feature that was known to work in version `v2.6.13-rc2` of your 53project. You start a bisect session as follows: 54 55------------------------------------------------ 56$ git bisect start 57$ git bisect bad # Current version is bad 58$ git bisect good v2.6.13-rc2 # v2.6.13-rc2 is known to be good 59------------------------------------------------ 60 61Once you have specified at least one bad and one good commit, `git 62bisect` selects a commit in the middle of that range of history, 63checks it out, and outputs something similar to the following: 64 65------------------------------------------------ 66Bisecting: 675 revisions left to test after this (roughly 10 steps) 67------------------------------------------------ 68 69You should now compile the checked-out version and test it. If that 70version works correctly, type 71 72------------------------------------------------ 73$ git bisect good 74------------------------------------------------ 75 76If that version is broken, type 77 78------------------------------------------------ 79$ git bisect bad 80------------------------------------------------ 81 82Then `git bisect` will respond with something like 83 84------------------------------------------------ 85Bisecting: 337 revisions left to test after this (roughly 9 steps) 86------------------------------------------------ 87 88Keep repeating the process: compile the tree, test it, and depending 89on whether it is good or bad run `git bisect good` or `git bisect bad` 90to ask for the next commit that needs testing. 91 92Eventually there will be no more revisions left to inspect, and the 93command will print out a description of the first bad commit. The 94reference `refs/bisect/bad` will be left pointing at that commit. 95 96 97Bisect reset 98~~~~~~~~~~~~ 99 100After a bisect session, to clean up the bisection state and return to 101the original HEAD, issue the following command: 102 103------------------------------------------------ 104$ git bisect reset 105------------------------------------------------ 106 107By default, this will return your tree to the commit that was checked 108out before `git bisect start`. (A new `git bisect start` will also do 109that, as it cleans up the old bisection state.) 110 111With an optional argument, you can return to a different commit 112instead: 113 114------------------------------------------------ 115$ git bisect reset <commit> 116------------------------------------------------ 117 118For example, `git bisect reset bisect/bad` will check out the first 119bad revision, while `git bisect reset HEAD` will leave you on the 120current bisection commit and avoid switching commits at all. 121 122 123Alternate terms 124~~~~~~~~~~~~~~~ 125 126Sometimes you are not looking for the commit that introduced a 127breakage, but rather for a commit that caused a change between some 128other "old" state and "new" state. For example, you might be looking 129for the commit that introduced a particular fix. Or you might be 130looking for the first commit in which the source-code filenames were 131finally all converted to your company's naming standard. Or whatever. 132 133In such cases it can be very confusing to use the terms "good" and 134"bad" to refer to "the state before the change" and "the state after 135the change". So instead, you can use the terms "old" and "new", 136respectively, in place of "good" and "bad". (But note that you cannot 137mix "good" and "bad" with "old" and "new" in a single session.) 138 139In this more general usage, you provide `git bisect` with a "new" 140commit that has some property and an "old" commit that doesn't have that 141property. Each time `git bisect` checks out a commit, you test if that 142commit has the property. If it does, mark the commit as "new"; 143otherwise, mark it as "old". When the bisection is done, `git bisect` 144will report which commit introduced the property. 145 146To use "old" and "new" instead of "good" and bad, you must run `git 147bisect start` without commits as argument and then run the following 148commands to add the commits: 149 150------------------------------------------------ 151git bisect old [<rev>] 152------------------------------------------------ 153 154to indicate that a commit was before the sought change, or 155 156------------------------------------------------ 157git bisect new [<rev>...] 158------------------------------------------------ 159 160to indicate that it was after. 161 162To get a reminder of the currently used terms, use 163 164------------------------------------------------ 165git bisect terms 166------------------------------------------------ 167 168You can get just the old (respectively new) term with `git bisect terms 169--term-old` or `git bisect terms --term-good`. 170 171If you would like to use your own terms instead of "bad"/"good" or 172"new"/"old", you can choose any names you like (except existing bisect 173subcommands like `reset`, `start`, ...) by starting the 174bisection using 175 176------------------------------------------------ 177git bisect start --term-old <term-old> --term-new <term-new> 178------------------------------------------------ 179 180For example, if you are looking for a commit that introduced a 181performance regression, you might use 182 183------------------------------------------------ 184git bisect start --term-old fast --term-new slow 185------------------------------------------------ 186 187Or if you are looking for the commit that fixed a bug, you might use 188 189------------------------------------------------ 190git bisect start --term-new fixed --term-old broken 191------------------------------------------------ 192 193Then, use `git bisect <term-old>` and `git bisect <term-new>` instead 194of `git bisect good` and `git bisect bad` to mark commits. 195 196Bisect visualize/view 197~~~~~~~~~~~~~~~~~~~~~ 198 199To see the currently remaining suspects in 'gitk', issue the following 200command during the bisection process (the subcommand `view` can be used 201as an alternative to `visualize`): 202 203------------ 204$ git bisect visualize 205------------ 206 207If the `DISPLAY` environment variable is not set, 'git log' is used 208instead. You can also give command-line options such as `-p` and 209`--stat`. 210 211------------ 212$ git bisect visualize --stat 213------------ 214 215Bisect log and bisect replay 216~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 217 218After having marked revisions as good or bad, issue the following 219command to show what has been done so far: 220 221------------ 222$ git bisect log 223------------ 224 225If you discover that you made a mistake in specifying the status of a 226revision, you can save the output of this command to a file, edit it to 227remove the incorrect entries, and then issue the following commands to 228return to a corrected state: 229 230------------ 231$ git bisect reset 232$ git bisect replay that-file 233------------ 234 235Avoiding testing a commit 236~~~~~~~~~~~~~~~~~~~~~~~~~ 237 238If, in the middle of a bisect session, you know that the suggested 239revision is not a good one to test (e.g. it fails to build and you 240know that the failure does not have anything to do with the bug you 241are chasing), you can manually select a nearby commit and test that 242one instead. 243 244For example: 245 246------------ 247$ git bisect good/bad # previous round was good or bad. 248Bisecting: 337 revisions left to test after this (roughly 9 steps) 249$ git bisect visualize # oops, that is uninteresting. 250$ git reset --hard HEAD~3 # try 3 revisions before what 251 # was suggested 252------------ 253 254Then compile and test the chosen revision, and afterwards mark 255the revision as good or bad in the usual manner. 256 257Bisect skip 258~~~~~~~~~~~ 259 260Instead of choosing a nearby commit by yourself, you can ask Git to do 261it for you by issuing the command: 262 263------------ 264$ git bisect skip # Current version cannot be tested 265------------ 266 267However, if you skip a commit adjacent to the one you are looking for, 268Git will be unable to tell exactly which of those commits was the 269first bad one. 270 271You can also skip a range of commits, instead of just one commit, 272using range notation. For example: 273 274------------ 275$ git bisect skip v2.5..v2.6 276------------ 277 278This tells the bisect process that no commit after `v2.5`, up to and 279including `v2.6`, should be tested. 280 281Note that if you also want to skip the first commit of the range you 282would issue the command: 283 284------------ 285$ git bisect skip v2.5 v2.5..v2.6 286------------ 287 288This tells the bisect process that the commits between `v2.5` and 289`v2.6` (inclusive) should be skipped. 290 291 292Cutting down bisection by giving more parameters to bisect start 293~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 294 295You can further cut down the number of trials, if you know what part of 296the tree is involved in the problem you are tracking down, by specifying 297path parameters when issuing the `bisect start` command: 298 299------------ 300$ git bisect start -- arch/i386 include/asm-i386 301------------ 302 303If you know beforehand more than one good commit, you can narrow the 304bisect space down by specifying all of the good commits immediately after 305the bad commit when issuing the `bisect start` command: 306 307------------ 308$ git bisect start v2.6.20-rc6 v2.6.20-rc4 v2.6.20-rc1 -- 309 # v2.6.20-rc6 is bad 310 # v2.6.20-rc4 and v2.6.20-rc1 are good 311------------ 312 313Bisect run 314~~~~~~~~~~ 315 316If you have a script that can tell if the current source code is good 317or bad, you can bisect by issuing the command: 318 319------------ 320$ git bisect run my_script arguments 321------------ 322 323Note that the script (`my_script` in the above example) should exit 324with code 0 if the current source code is good/old, and exit with a 325code between 1 and 127 (inclusive), except 125, if the current source 326code is bad/new. 327 328Any other exit code will abort the bisect process. It should be noted 329that a program that terminates via `exit(-1)` leaves $? = 255, (see the 330exit(3) manual page), as the value is chopped with `& 0377`. 331 332The special exit code 125 should be used when the current source code 333cannot be tested. If the script exits with this code, the current 334revision will be skipped (see `git bisect skip` above). 125 was chosen 335as the highest sensible value to use for this purpose, because 126 and 127 336are used by POSIX shells to signal specific error status (127 is for 337command not found, 126 is for command found but not executable--these 338details do not matter, as they are normal errors in the script, as far as 339`bisect run` is concerned). 340 341You may often find that during a bisect session you want to have 342temporary modifications (e.g. s/#define DEBUG 0/#define DEBUG 1/ in a 343header file, or "revision that does not have this commit needs this 344patch applied to work around another problem this bisection is not 345interested in") applied to the revision being tested. 346 347To cope with such a situation, after the inner 'git bisect' finds the 348next revision to test, the script can apply the patch 349before compiling, run the real test, and afterwards decide if the 350revision (possibly with the needed patch) passed the test and then 351rewind the tree to the pristine state. Finally the script should exit 352with the status of the real test to let the `git bisect run` command loop 353determine the eventual outcome of the bisect session. 354 355OPTIONS 356------- 357--no-checkout:: 358+ 359Do not checkout the new working tree at each iteration of the bisection 360process. Instead just update a special reference named `BISECT_HEAD` to make 361it point to the commit that should be tested. 362+ 363This option may be useful when the test you would perform in each step 364does not require a checked out tree. 365+ 366If the repository is bare, `--no-checkout` is assumed. 367 368EXAMPLES 369-------- 370 371* Automatically bisect a broken build between v1.2 and HEAD: 372+ 373------------ 374$ git bisect start HEAD v1.2 -- # HEAD is bad, v1.2 is good 375$ git bisect run make # "make" builds the app 376$ git bisect reset # quit the bisect session 377------------ 378 379* Automatically bisect a test failure between origin and HEAD: 380+ 381------------ 382$ git bisect start HEAD origin -- # HEAD is bad, origin is good 383$ git bisect run make test # "make test" builds and tests 384$ git bisect reset # quit the bisect session 385------------ 386 387* Automatically bisect a broken test case: 388+ 389------------ 390$ cat ~/test.sh 391#!/bin/sh 392make || exit 125 # this skips broken builds 393~/check_test_case.sh # does the test case pass? 394$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10 395$ git bisect run ~/test.sh 396$ git bisect reset # quit the bisect session 397------------ 398+ 399Here we use a `test.sh` custom script. In this script, if `make` 400fails, we skip the current commit. 401`check_test_case.sh` should `exit 0` if the test case passes, 402and `exit 1` otherwise. 403+ 404It is safer if both `test.sh` and `check_test_case.sh` are 405outside the repository to prevent interactions between the bisect, 406make and test processes and the scripts. 407 408* Automatically bisect with temporary modifications (hot-fix): 409+ 410------------ 411$ cat ~/test.sh 412#!/bin/sh 413 414# tweak the working tree by merging the hot-fix branch 415# and then attempt a build 416if git merge --no-commit hot-fix && 417 make 418then 419 # run project specific test and report its status 420 ~/check_test_case.sh 421 status=$? 422else 423 # tell the caller this is untestable 424 status=125 425fi 426 427# undo the tweak to allow clean flipping to the next commit 428git reset --hard 429 430# return control 431exit $status 432------------ 433+ 434This applies modifications from a hot-fix branch before each test run, 435e.g. in case your build or test environment changed so that older 436revisions may need a fix which newer ones have already. (Make sure the 437hot-fix branch is based off a commit which is contained in all revisions 438which you are bisecting, so that the merge does not pull in too much, or 439use `git cherry-pick` instead of `git merge`.) 440 441* Automatically bisect a broken test case: 442+ 443------------ 444$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10 445$ git bisect run sh -c "make || exit 125; ~/check_test_case.sh" 446$ git bisect reset # quit the bisect session 447------------ 448+ 449This shows that you can do without a run script if you write the test 450on a single line. 451 452* Locate a good region of the object graph in a damaged repository 453+ 454------------ 455$ git bisect start HEAD <known-good-commit> [ <boundary-commit> ... ] --no-checkout 456$ git bisect run sh -c ' 457 GOOD=$(git for-each-ref "--format=%(objectname)" refs/bisect/good-*) && 458 git rev-list --objects BISECT_HEAD --not $GOOD >tmp.$$ && 459 git pack-objects --stdout >/dev/null <tmp.$$ 460 rc=$? 461 rm -f tmp.$$ 462 test $rc = 0' 463 464$ git bisect reset # quit the bisect session 465------------ 466+ 467In this case, when 'git bisect run' finishes, bisect/bad will refer to a commit that 468has at least one parent whose reachable graph is fully traversable in the sense 469required by 'git pack objects'. 470 471* Look for a fix instead of a regression in the code 472+ 473------------ 474$ git bisect start 475$ git bisect new HEAD # current commit is marked as new 476$ git bisect old HEAD~10 # the tenth commit from now is marked as old 477------------ 478+ 479or: 480------------ 481$ git bisect start --term-old broken --term-new fixed 482$ git bisect fixed 483$ git bisect broken HEAD~10 484------------ 485 486Getting help 487~~~~~~~~~~~~ 488 489Use `git bisect` to get a short usage description, and `git bisect 490help` or `git bisect -h` to get a long usage description. 491 492SEE ALSO 493-------- 494link:git-bisect-lk2009.html[Fighting regressions with git bisect], 495linkgit:git-blame[1]. 496 497GIT 498--- 499Part of the linkgit:git[1] suite