Documentation / git-bisect.txton commit t6300: introduce test_date() helper (f95cecf)
   1git-bisect(1)
   2=============
   3
   4NAME
   5----
   6git-bisect - Find by binary search the change 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 help
  20 git bisect start [--no-checkout] [<bad> [<good>...]] [--] [<paths>...]
  21 git bisect bad [<rev>]
  22 git bisect good [<rev>...]
  23 git bisect skip [(<rev>|<range>)...]
  24 git bisect reset [<commit>]
  25 git bisect visualize
  26 git bisect replay <logfile>
  27 git bisect log
  28 git bisect run <cmd>...
  29
  30This command uses 'git rev-list --bisect' to help drive the
  31binary search process to find which change introduced a bug, given an
  32old "good" commit object name and a later "bad" commit object name.
  33
  34Getting 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
  40Basic bisect commands: start, bad, good
  41~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  42
  43Using the Linux kernel tree as an example, basic use of the bisect
  44command is as follows:
  45
  46------------------------------------------------
  47$ git bisect start
  48$ 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
  51------------------------------------------------
  52
  53When you have specified at least one bad and one good version, the
  54command bisects the revision tree and outputs something similar to
  55the following:
  56
  57------------------------------------------------
  58Bisecting: 675 revisions left to test after this
  59------------------------------------------------
  60
  61The 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:
  64
  65------------------------------------------------
  66$ git bisect good                       # this one is good
  67------------------------------------------------
  68
  69The output of this command would be something similar to the following:
  70
  71------------------------------------------------
  72Bisecting: 337 revisions left to test after this
  73------------------------------------------------
  74
  75You 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.
  78
  79Eventually 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".
  81
  82Bisect reset
  83~~~~~~~~~~~~
  84
  85After a bisect session, to clean up the bisection state and return to
  86the original HEAD (i.e., to quit bisecting), issue the following command:
  87
  88------------------------------------------------
  89$ git bisect reset
  90------------------------------------------------
  91
  92By 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.
 106
 107Bisect visualize
 108~~~~~~~~~~~~~~~~
 109
 110To see the currently remaining suspects in 'gitk', issue the following
 111command during the bisection process:
 112
 113------------
 114$ git bisect visualize
 115------------
 116
 117`view` may also be used as a synonym for `visualize`.
 118
 119If the 'DISPLAY' environment variable is not set, 'git log' is used
 120instead.  You can also give command-line options such as `-p` and
 121`--stat`.
 122
 123------------
 124$ git bisect view --stat
 125------------
 126
 127Bisect log and bisect replay
 128~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 129
 130After having marked revisions as good or bad, issue the following
 131command to show what has been done so far:
 132
 133------------
 134$ git bisect log
 135------------
 136
 137If 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:
 141
 142------------
 143$ git bisect reset
 144$ git bisect replay that-file
 145------------
 146
 147Avoiding testing a commit
 148~~~~~~~~~~~~~~~~~~~~~~~~~
 149
 150If, in the middle of a bisect session, you know that the next suggested
 151revision is not a good one to test (e.g. the change the commit
 152introduces 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
 154want to find a nearby commit and try that instead.
 155
 156For example:
 157
 158------------
 159$ git bisect good/bad                   # previous round was good or bad.
 160Bisecting: 337 revisions left to test after this
 161$ git bisect visualize                  # oops, that is uninteresting.
 162$ git reset --hard HEAD~3               # try 3 revisions before what
 163                                        # was suggested
 164------------
 165
 166Then compile and test the chosen revision, and afterwards mark
 167the revision as good or bad in the usual manner.
 168
 169Bisect skip
 170~~~~~~~~~~~~
 171
 172Instead of choosing by yourself a nearby commit, you can ask Git
 173to do it for you by issuing the command:
 174
 175------------
 176$ git bisect skip                 # Current version cannot be tested
 177------------
 178
 179But Git may eventually be unable to tell the first bad commit among
 180a bad commit and one or more skipped commits.
 181
 182You 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
 189This tells the bisect process that no commit after `v2.5`, up to and
 190including `v2.6`, should be tested.
 191
 192Note that if you also want to skip the first commit of the range you
 193would issue the command:
 194
 195------------
 196$ git bisect skip v2.5 v2.5..v2.6
 197------------
 198
 199This tells the bisect process that the commits between `v2.5` included
 200and `v2.6` included should be skipped.
 201
 202
 203Cutting down bisection by giving more parameters to bisect start
 204~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 205
 206You 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:
 209
 210------------
 211$ git bisect start -- arch/i386 include/asm-i386
 212------------
 213
 214If 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:
 217
 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
 222------------
 223
 224Bisect run
 225~~~~~~~~~~
 226
 227If you have a script that can tell if the current source code is good
 228or bad, you can bisect by issuing the command:
 229
 230------------
 231$ git bisect run my_script arguments
 232------------
 233
 234Note 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
 236code between 1 and 127 (inclusive), except 125, if the current
 237source code is bad.
 238
 239Any 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".
 242
 243The special exit code 125 should be used when the current source code
 244cannot be tested. If the script exits with this code, the current
 245revision 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).
 251
 252You 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.
 257
 258To cope with such a situation, after the inner 'git bisect' finds the
 259next 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.
 265
 266OPTIONS
 267-------
 268--no-checkout::
 269+
 270Do not checkout the new working tree at each iteration of the bisection
 271process. Instead just update a special reference named 'BISECT_HEAD' to make
 272it point to the commit that should be tested.
 273+
 274This option may be useful when the test you would perform in each step
 275does not require a checked out tree.
 276+
 277If the repository is bare, `--no-checkout` is assumed.
 278
 279EXAMPLES
 280--------
 281
 282* Automatically bisect a broken build between v1.2 and HEAD:
 283+
 284------------
 285$ git bisect start HEAD v1.2 --      # HEAD is bad, v1.2 is good
 286$ git bisect run make                # "make" builds the app
 287$ git bisect reset                   # quit the bisect session
 288------------
 289
 290* Automatically bisect a test failure between origin and HEAD:
 291+
 292------------
 293$ git bisect start HEAD origin --    # HEAD is bad, origin is good
 294$ git bisect run make test           # "make test" builds and tests
 295$ git bisect reset                   # quit the bisect session
 296------------
 297
 298* Automatically bisect a broken test case:
 299+
 300------------
 301$ cat ~/test.sh
 302#!/bin/sh
 303make || exit 125                     # this skips broken builds
 304~/check_test_case.sh                 # does the test case pass?
 305$ git bisect start HEAD HEAD~10 --   # culprit is among the last 10
 306$ git bisect run ~/test.sh
 307$ git bisect reset                   # quit the bisect session
 308------------
 309+
 310Here we use a "test.sh" custom script. In this script, if "make"
 311fails, we skip the current commit.
 312"check_test_case.sh" should "exit 0" if the test case passes,
 313and "exit 1" otherwise.
 314+
 315It is safer if both "test.sh" and "check_test_case.sh" are
 316outside the repository to prevent interactions between the bisect,
 317make and test processes and the scripts.
 318
 319* Automatically bisect with temporary modifications (hot-fix):
 320+
 321------------
 322$ cat ~/test.sh
 323#!/bin/sh
 324
 325# tweak the working tree by merging the hot-fix branch
 326# and then attempt a build
 327if      git merge --no-commit hot-fix &&
 328        make
 329then
 330        # run project specific test and report its status
 331        ~/check_test_case.sh
 332        status=$?
 333else
 334        # tell the caller this is untestable
 335        status=125
 336fi
 337
 338# undo the tweak to allow clean flipping to the next commit
 339git reset --hard
 340
 341# return control
 342exit $status
 343------------
 344+
 345This applies modifications from a hot-fix branch before each test run,
 346e.g. in case your build or test environment changed so that older
 347revisions may need a fix which newer ones have already. (Make sure the
 348hot-fix branch is based off a commit which is contained in all revisions
 349which you are bisecting, so that the merge does not pull in too much, or
 350use `git cherry-pick` instead of `git merge`.)
 351
 352* Automatically bisect a broken test case:
 353+
 354------------
 355$ git bisect start HEAD HEAD~10 --   # culprit is among the last 10
 356$ git bisect run sh -c "make || exit 125; ~/check_test_case.sh"
 357$ git bisect reset                   # quit the bisect session
 358------------
 359+
 360This shows that you can do without a run script if you write the test
 361on a single line.
 362
 363* Locate a good region of the object graph in a damaged repository
 364+
 365------------
 366$ git bisect start HEAD <known-good-commit> [ <boundary-commit> ... ] --no-checkout
 367$ git bisect run sh -c '
 368        GOOD=$(git for-each-ref "--format=%(objectname)" refs/bisect/good-*) &&
 369        git rev-list --objects BISECT_HEAD --not $GOOD >tmp.$$ &&
 370        git pack-objects --stdout >/dev/null <tmp.$$
 371        rc=$?
 372        rm -f tmp.$$
 373        test $rc = 0'
 374
 375$ git bisect reset                   # quit the bisect session
 376------------
 377+
 378In this case, when 'git bisect run' finishes, bisect/bad will refer to a commit that
 379has at least one parent whose reachable graph is fully traversable in the sense
 380required by 'git pack objects'.
 381
 382
 383SEE ALSO
 384--------
 385link:git-bisect-lk2009.html[Fighting regressions with git bisect],
 386linkgit:git-blame[1].
 387
 388GIT
 389---
 390Part of the linkgit:git[1] suite