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 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 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 term 169--term-old` or `git bisect term --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 197~~~~~~~~~~~~~~~~ 198 199To see the currently remaining suspects in 'gitk', issue the following 200command during the bisection process: 201 202------------ 203$ git bisect visualize 204------------ 205 206`view` may also be used as a synonym for `visualize`. 207 208If the `DISPLAY` environment variable is not set, 'git log' is used 209instead. You can also give command-line options such as `-p` and 210`--stat`. 211 212------------ 213$ git bisect view --stat 214------------ 215 216Bisect log and bisect replay 217~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 218 219After having marked revisions as good or bad, issue the following 220command to show what has been done so far: 221 222------------ 223$ git bisect log 224------------ 225 226If you discover that you made a mistake in specifying the status of a 227revision, you can save the output of this command to a file, edit it to 228remove the incorrect entries, and then issue the following commands to 229return to a corrected state: 230 231------------ 232$ git bisect reset 233$ git bisect replay that-file 234------------ 235 236Avoiding testing a commit 237~~~~~~~~~~~~~~~~~~~~~~~~~ 238 239If, in the middle of a bisect session, you know that the suggested 240revision is not a good one to test (e.g. it fails to build and you 241know that the failure does not have anything to do with the bug you 242are chasing), you can manually select a nearby commit and test that 243one instead. 244 245For example: 246 247------------ 248$ git bisect good/bad # previous round was good or bad. 249Bisecting: 337 revisions left to test after this (roughly 9 steps) 250$ git bisect visualize # oops, that is uninteresting. 251$ git reset --hard HEAD~3 # try 3 revisions before what 252 # was suggested 253------------ 254 255Then compile and test the chosen revision, and afterwards mark 256the revision as good or bad in the usual manner. 257 258Bisect skip 259~~~~~~~~~~~ 260 261Instead of choosing a nearby commit by yourself, you can ask Git to do 262it for you by issuing the command: 263 264------------ 265$ git bisect skip # Current version cannot be tested 266------------ 267 268However, if you skip a commit adjacent to the one you are looking for, 269Git will be unable to tell exactly which of those commits was the 270first bad one. 271 272You can also skip a range of commits, instead of just one commit, 273using range notation. For example: 274 275------------ 276$ git bisect skip v2.5..v2.6 277------------ 278 279This tells the bisect process that no commit after `v2.5`, up to and 280including `v2.6`, should be tested. 281 282Note that if you also want to skip the first commit of the range you 283would issue the command: 284 285------------ 286$ git bisect skip v2.5 v2.5..v2.6 287------------ 288 289This tells the bisect process that the commits between `v2.5` and 290`v2.6` (inclusive) should be skipped. 291 292 293Cutting down bisection by giving more parameters to bisect start 294~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 296You can further cut down the number of trials, if you know what part of 297the tree is involved in the problem you are tracking down, by specifying 298path parameters when issuing the `bisect start` command: 299 300------------ 301$ git bisect start -- arch/i386 include/asm-i386 302------------ 303 304If you know beforehand more than one good commit, you can narrow the 305bisect space down by specifying all of the good commits immediately after 306the bad commit when issuing the `bisect start` command: 307 308------------ 309$ git bisect start v2.6.20-rc6 v2.6.20-rc4 v2.6.20-rc1 -- 310 # v2.6.20-rc6 is bad 311 # v2.6.20-rc4 and v2.6.20-rc1 are good 312------------ 313 314Bisect run 315~~~~~~~~~~ 316 317If you have a script that can tell if the current source code is good 318or bad, you can bisect by issuing the command: 319 320------------ 321$ git bisect run my_script arguments 322------------ 323 324Note that the script (`my_script` in the above example) should exit 325with code 0 if the current source code is good/old, and exit with a 326code between 1 and 127 (inclusive), except 125, if the current source 327code is bad/new. 328 329Any other exit code will abort the bisect process. It should be noted 330that a program that terminates via `exit(-1)` leaves $? = 255, (see the 331exit(3) manual page), as the value is chopped with `& 0377`. 332 333The special exit code 125 should be used when the current source code 334cannot be tested. If the script exits with this code, the current 335revision will be skipped (see `git bisect skip` above). 125 was chosen 336as the highest sensible value to use for this purpose, because 126 and 127 337are used by POSIX shells to signal specific error status (127 is for 338command not found, 126 is for command found but not executable--these 339details do not matter, as they are normal errors in the script, as far as 340`bisect run` is concerned). 341 342You may often find that during a bisect session you want to have 343temporary modifications (e.g. s/#define DEBUG 0/#define DEBUG 1/ in a 344header file, or "revision that does not have this commit needs this 345patch applied to work around another problem this bisection is not 346interested in") applied to the revision being tested. 347 348To cope with such a situation, after the inner 'git bisect' finds the 349next revision to test, the script can apply the patch 350before compiling, run the real test, and afterwards decide if the 351revision (possibly with the needed patch) passed the test and then 352rewind the tree to the pristine state. Finally the script should exit 353with the status of the real test to let the `git bisect run` command loop 354determine the eventual outcome of the bisect session. 355 356OPTIONS 357------- 358--no-checkout:: 359+ 360Do not checkout the new working tree at each iteration of the bisection 361process. Instead just update a special reference named `BISECT_HEAD` to make 362it point to the commit that should be tested. 363+ 364This option may be useful when the test you would perform in each step 365does not require a checked out tree. 366+ 367If the repository is bare, `--no-checkout` is assumed. 368 369EXAMPLES 370-------- 371 372* Automatically bisect a broken build between v1.2 and HEAD: 373+ 374------------ 375$ git bisect start HEAD v1.2 -- # HEAD is bad, v1.2 is good 376$ git bisect run make # "make" builds the app 377$ git bisect reset # quit the bisect session 378------------ 379 380* Automatically bisect a test failure between origin and HEAD: 381+ 382------------ 383$ git bisect start HEAD origin -- # HEAD is bad, origin is good 384$ git bisect run make test # "make test" builds and tests 385$ git bisect reset # quit the bisect session 386------------ 387 388* Automatically bisect a broken test case: 389+ 390------------ 391$ cat ~/test.sh 392#!/bin/sh 393make || exit 125 # this skips broken builds 394~/check_test_case.sh # does the test case pass? 395$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10 396$ git bisect run ~/test.sh 397$ git bisect reset # quit the bisect session 398------------ 399+ 400Here we use a `test.sh` custom script. In this script, if `make` 401fails, we skip the current commit. 402`check_test_case.sh` should `exit 0` if the test case passes, 403and `exit 1` otherwise. 404+ 405It is safer if both `test.sh` and `check_test_case.sh` are 406outside the repository to prevent interactions between the bisect, 407make and test processes and the scripts. 408 409* Automatically bisect with temporary modifications (hot-fix): 410+ 411------------ 412$ cat ~/test.sh 413#!/bin/sh 414 415# tweak the working tree by merging the hot-fix branch 416# and then attempt a build 417if git merge --no-commit hot-fix && 418 make 419then 420 # run project specific test and report its status 421 ~/check_test_case.sh 422 status=$? 423else 424 # tell the caller this is untestable 425 status=125 426fi 427 428# undo the tweak to allow clean flipping to the next commit 429git reset --hard 430 431# return control 432exit $status 433------------ 434+ 435This applies modifications from a hot-fix branch before each test run, 436e.g. in case your build or test environment changed so that older 437revisions may need a fix which newer ones have already. (Make sure the 438hot-fix branch is based off a commit which is contained in all revisions 439which you are bisecting, so that the merge does not pull in too much, or 440use `git cherry-pick` instead of `git merge`.) 441 442* Automatically bisect a broken test case: 443+ 444------------ 445$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10 446$ git bisect run sh -c "make || exit 125; ~/check_test_case.sh" 447$ git bisect reset # quit the bisect session 448------------ 449+ 450This shows that you can do without a run script if you write the test 451on a single line. 452 453* Locate a good region of the object graph in a damaged repository 454+ 455------------ 456$ git bisect start HEAD <known-good-commit> [ <boundary-commit> ... ] --no-checkout 457$ git bisect run sh -c ' 458 GOOD=$(git for-each-ref "--format=%(objectname)" refs/bisect/good-*) && 459 git rev-list --objects BISECT_HEAD --not $GOOD >tmp.$$ && 460 git pack-objects --stdout >/dev/null <tmp.$$ 461 rc=$? 462 rm -f tmp.$$ 463 test $rc = 0' 464 465$ git bisect reset # quit the bisect session 466------------ 467+ 468In this case, when 'git bisect run' finishes, bisect/bad will refer to a commit that 469has at least one parent whose reachable graph is fully traversable in the sense 470required by 'git pack objects'. 471 472* Look for a fix instead of a regression in the code 473+ 474------------ 475$ git bisect start 476$ git bisect new HEAD # current commit is marked as new 477$ git bisect old HEAD~10 # the tenth commit from now is marked as old 478------------ 479+ 480or: 481------------ 482$ git bisect start --term-old broken --term-new fixed 483$ git bisect fixed 484$ git bisect broken HEAD~10 485------------ 486 487Getting help 488~~~~~~~~~~~~ 489 490Use `git bisect` to get a short usage description, and `git bisect 491help` or `git bisect -h` to get a long usage description. 492 493SEE ALSO 494-------- 495link:git-bisect-lk2009.html[Fighting regressions with git bisect], 496linkgit:git-blame[1]. 497 498GIT 499--- 500Part of the linkgit:git[1] suite