Documentation / git-bisect.txton commit builtin/grep: convert to struct object_id (1db1108)
   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