Skip to content

Instantly share code, notes, and snippets.

@psenger
Last active October 5, 2023 20:57
Show Gist options
  • Select an option

  • Save psenger/bb1e8320b012717d58278e7c66e6b45c to your computer and use it in GitHub Desktop.

Select an option

Save psenger/bb1e8320b012717d58278e7c66e6b45c to your computer and use it in GitHub Desktop.
[Finding a committed bug with Git] #git #git-bisect #bug

Finding a committed bug with Git CLI

git-bisect - Use binary search to find the commit that introduced a bug

Basic bisect commands: start, bad, good

As an example, suppose you are trying to find the commit that broke a feature that was known to work in version v2.6.13-rc2 of your project. You start a bisect session as follows:

$ git bisect start
$ git bisect bad                 # Current version is bad
$ git bisect good v2.6.13-rc2    # v2.6.13-rc2 is known to be good

Once you have specified at least one bad and one good commit, git bisect selects a commit in the middle of that range of history, checks it out, and outputs something similar to the following:

Bisecting: 675 revisions left to test after this (roughly 10 steps)

You should now compile the checked-out version and test it. If that version works correctly, type

$ git bisect good

If that version is broken, type

$ git bisect bad

Then git bisect will respond with something like

Bisecting: 337 revisions left to test after this (roughly 9 steps)

Keep repeating the process: compile the tree, test it, and depending on whether it is good or bad run git bisect good or git bisect bad to ask for the next commit that needs testing.

Eventually there will be no more revisions left to inspect, and the command will print out a description of the first bad commit. The reference refs/bisect/bad will be left pointing at that commit.

Bisect reset

After a bisect session, to clean up the bisection state and return to the original HEAD, issue the following command:

$ git bisect reset

By default, this will return your tree to the commit that was checked out before git bisect start. (A new git bisect start will also do that, as it cleans up the old bisection state.)

With an optional argument, you can return to a different commit instead:

$ git bisect reset <commit>

For example, git bisect reset bisect/bad will check out the first bad revision, while git bisect reset HEAD will leave you on the current bisection commit and avoid switching commits at all.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment