Occasionally a tester reports a bug which is not introduced in the last commit. After investigating the bug the cause is found, but what to do? Most version control systems support a tool called blame. This however requires you to first find the code behind the bug. So after you find the cause, knowing who did this is only going towards a shaming situation.
git bisect
In most cases finding the cause of a bug is most time consuming, so how can we optimize this? How can we stop blaming, just for shaming? git bisect is a helpful tool which can help us achieve these goals.
Bug report!
Let’s imagine a scenario where the following bug is reported:
Given a user is on the checkout page,
when hovering over the help icon
then the help text is not visible,
but we expected the help text to be visible!
Test to identify
In this scenario the tests are run with grunt, karma and ngScenario. In grunt we configured a task to run all our tests:
grunt test
To automatically see if the bug is present, it is best to write a test to confirm the case. For this example’s sake, this test case will be called confirm case.
Preparations
In this scenario, there are biweekly sprints, where each sprint will have a new release. The last release didn’t have this bug, which will serve as a reference for git bisect. For this example, the sha for the release tag is #tag.
To start the analyses, run:
git bisect start
Then let git know the current commit is broken:
git bisect bad
Tell git the first correct commit:
git bisect good #tag
Analyse
With git bisect git will checkout commits between the first good commit and the current bad commit. On every checkout git is able to run some commands to tell if the checked out commit is good or bad to narrow down the search to the first bad commit. Aka the commit that introduced the bug! With the help of the automated tests git can automatically find the first bad commit for us:
git bisect run grunt
Blame
Now that the first bad commit has been identified, it is easy to find the cause if the commit messages make sense! In this example:
Author: Bob
Renamed the ‘buynow’ directive to ‘checkout’.
To initialize the new directive include this tag in your view:
“`html
<div data-checkout=”checkoutid” />
“`
Resolve
Now that the commit is found, we have the following information:
- The change set that introduced the bug
Obviously this change set is a lot smaller compared to all changes made from the tag till the bad bug - The commit message with useful information about what the change was made for
When a commit message is scoped to just this change, it is easy to understand why something is changed - The author of the commit
If there are still misunderstandings, the author is known and hopefully can explain some decisions to resolve the bug
In this example the css for showing the help text is bound on the attribute:
[data-buynow]:hover { … }
This caused the hover to not work anymore and the fix is just renamed the selector as well!
Conclusion
With git bisect bugs can be debugged more easily and straight forward. When someone is blamed, this person is not shamed. This person is then instead asked for his knowledge on this commit, rather then just pointing a finger!
Solve the problem as a team 🙂