Small knowledge, big challenge! This article is participating in the creation activity of “Essential Tips for Programmers”.

This article also participated in the “Digitalstar Project” to win a creative gift package and creative incentive money.

The Git snippet collection contains a variety of short tips and tricks for all currently maintained versions of git. It includes most commonly-used commands and covers various use-cases in the form of simplified documentation, complete with multiple examples.

Short code snippets for all your development needs.

Uses a binary search algorithm and a given script to find which commit in history introduced a bug.

  • Use git bisect start
  • Use git bisect good <commit> to mark a <commit> as “good”, indicating it is known to be bug-free.
  • Use git bisect bad <commit> to mark a different <commit> as “bad” indicating it has the bug.
  • Use git bisect run <command> to run the given <command> on each subsequent commit to find which commit introduce the bug.
  • Use git bisect reset to reset to the original branch. You can optionally specify a <commit> to reset to.
$ git bisect start
$ git bisect good <commit>
$ git bisect bad <commit>
$ git bisect run <commit>
$ git bisect reset [<commit>]
Copy the code

Rough Example

$ git bisect start
$ git bisect good 3050fc0de
$ git bisect bad c191f90c7
$ git bisect run npm test # Run `npm test` for each commit
#. some time later the bad commit will be printed
$ git bisect reset # Goes to the original branch
Copy the code

The Detailed Example 🔥

A linear code commit history is a great help in automating problem location, allowing us to go back from the current problematic commit to the first problematic commit in history.

Even better, we can use a split lookup to find the problematic commit in order (
L o g N LogN
) time.

For example, in a codebase, there is a linear commit history between
C 101 C101
and
C 200 C200
. We know a test that passes at
C 101 C101
but fails at
C 200 C200
.
We can checkout
C 101 C101
,
C 102 C102
, till
C 200 C200
, and run the tests after each checkout to find the first commit that fails the test.

However, the method above is extremely inefficient. So, Git provides us with automated test scripts. Here is the demo:

$ git clone [email protected]:jungejason/git-bisect-run-demo.git
cd git-bisect-run-demo
Copy the code

57715@Wu-Yikun MINGW64 /d/Wyk's WorkSpace/git-bisect-run-demo (master)
$ git bisect start

57715@Wu-Yikun MINGW64 /d/Wyk's WorkSpace/git-bisect-run-demo (master|BISECTING)
$ git bisect bad HEAD

57715@Wu-Yikun MINGW64 /d/Wyk's WorkSpace/git-bisect-run-demo (master|BISECTING)
$ git log --grep='C101' --oneline | cat
f1a0469 C101 - change another number

57715@Wu-Yikun MINGW64 /d/Wyk's WorkSpace/git-bisect-run-demo (master|BISECTING)
$ git bisect good f1a0469Bisecting: 49 revisions left to test after this (roughly 6 steps) [94d9240b05a108395fb2969fe2a4b6c21fce8e1b] C150 - some change 57715@Wu-Yikun MINGW64 /d/Wyk's WorkSpace/git-bisect-run-demo ((94d9240...) |BISECTING)$ git bisect run bash test.sh
running bash test.sh
Test Passed
Bisecting: 24 revisions left to test after this (roughly 5 steps)
[8753c8521a465956807e26fe7a3ee79daa5cceb2] C175 - some change
running bash test.sh
Test Passed
Bisecting: 12 revisions left to test after this (roughly 4 steps)
[4e7bafdc9cbab4b2409f7d2d78822200c4578c5b] C187 - some change
running bash test.sh
Test Failed
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[7028c24aea20364fa69af786e31a5e5267c34c36] C181 - some change
running bash test.sh
Test Failed
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[c8e79ede15330e6247cbfe7b212c483483b2433d] C178 - some change
running bash test.sh
Test Passed
Bisecting: 0 revisions left to test after this (roughly 1 step)
[327fc00b43b5041cb2fc626ab8589c607111f164] C180 - some change
running bash test.sh
Test Passed
7028c24aea20364fa69af786e31a5e5267c34c36 is the first bad commit
commit 7028c24aea20364fa69af786e31a5e5267c34c36
Author: Jason Ge <[email protected]>
Date:   Tue Oct 1 16:50:32 2019 +0800

    C181 - some change

    Summary: add one line

    Test: none

 inventory.csv | 1 +
 1 file changed, 1 insertion(+)
bisect run success
Copy the code

$ git bisect reset
Copy the code

git bisect run automatically finds
C 181 C181
.

7028c24aea20364fa69af786e31a5e5267c34c36 is the first bad commit commit 7028c24aea20364fa69af786e31a5e5267c34c36 Author:  Jason Ge <[email protected]> Date: Tue Oct 1 16:50:32 2019 +0800 C181 - some change Summary: add one line Test: none inventory.csv | 1 + 1 file changed, 1 insertion(+) bisect run successCopy the code

(Over)

🌊Wish you can benefit from this article.

🍺And welcome to leave your thoughts in the comments section that we can discuss and share ideas with each other.