Git Bisect
A command I never knew about. There are 22 suggested commands when you type git help
into your terminal.
usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
[--super-prefix=<path>] [--config-env=<name>=<envvar>]
<command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
restore Restore working tree files
rm Remove files from the working tree and from the index
examine the history and state (see also: git help revisions)
bisect Use binary search to find the commit that introduced a bug
diff Show changes between commits, commit and working tree, etc
grep Print lines matching a pattern
log Show commit logs
show Show various types of objects
status Show the working tree status
grow, mark and tweak your common history
branch List, create, or delete branches
commit Record changes to the repository
merge Join two or more development histories together
rebase Reapply commits on top of another base tip
reset Reset current HEAD to the specified state
switch Switch branches
tag Create, list, delete or verify a tag object signed with GPG
collaborate (see also: git help workflows)
fetch Download objects and refs from another repository
pull Fetch from and integrate with another repository or a local branch
push Update remote refs along with associated objects
'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.
Some of these commands you will use once in a project, some you will use everyday. In that list is a command that I have frequently overlooked and never researched.
git bisect
It self describes as
Use binary search to find the commit that introduced a bug
Translating this into practical uses, it allows you to mark a point in time where it is broken, a point in time where it was working and step through each commit and test exactly when it breaks. This can also be automated if the bug you are experiencing can be detected programmatically.
Let’s talk about using it manually. Within your git repository:
- Start the process by running:
git bisect start
- Mark the current (broken) commit:
git bisect bad
- Mark a known good commit (e.g., 15 commits ago):
git bisect good HEAD~15
- Alternatively, you can combine these steps:
git bisect start HEAD HEAD~10 --
- Step through each commit:
If the issue persists, mark the commit as bad:git bisect bad
If the issue is resolved, mark it as good:git bisect good
- Receive the final report identifying the problematic commit.
- Exit bisect mode when finished:
git bisect reset
I found this an incredibly interesting and useful tool, I hope you can find use from it too.