52 lines
2.3 KiB
Markdown
52 lines
2.3 KiB
Markdown
---
|
||
layout: post
|
||
title: "Using Git bisect to find the first good commit"
|
||
date: 2015-02-26 10:42:56+00:00
|
||
tags: [git]
|
||
permalink: /blog/2015/2/26/using-git-bisect-to-find-the-first-good-commit
|
||
published: true
|
||
author:
|
||
name: Gergely Polonkai
|
||
email: gergely@polonkai.eu
|
||
---
|
||
|
||
Few months ago we “implemented” a bug in our software, which was released
|
||
to the customers. We continued development for two weeks when the first
|
||
customer ticket arrived about the bug. We successfully reproduced it with
|
||
the customer’s version, but not with the development sources; it turned out
|
||
that one of the developers unconsciously fixed the bug. The devs spent some
|
||
hours finding where the fix lied before coming to me like “There is
|
||
`git-bisect` which we can use to find the commit where we messed up things.
|
||
Is there a way to find where we fixed it?”
|
||
|
||
For those who don’t know this feature, you have to mark a known “good” and
|
||
“bad” commit, then git-bisect will go through the commits between this two,
|
||
present you the corresponding snapshots, and you have to mark each of them
|
||
as “good” or “bad”. At the end, you will get a commit hash where the bug
|
||
first occured.
|
||
|
||
As it turned out, our developers’ problem rooted in the naming convention
|
||
of git-bisect: they assumed that the “good” commit must be a working one,
|
||
while a “bad” one must be the buggy. In this case, we did the following:
|
||
|
||
The commit with the customer’s release tag was marked as good (even though
|
||
this had the bug), and the latest commit on our development branch was
|
||
marked as “bad” (even though the bug was fixed by then). Now with every
|
||
snapshot presented by git-bisect we had to do the opposite what you usually
|
||
do: mark commits still having the bug as “good”, and commits that don’t as
|
||
“bad”. At the end, we had the hash of the commit that fixed the bug (among
|
||
some other things; luckily, the developer who pushed that commit had a
|
||
workflow that introduced a lot of cherry-picking and squashing before the
|
||
push, so he could easily find the bit that actually fixed the problem in
|
||
his local repository with the same technique).
|
||
|
||
[This StackOverflow answer](http://stackoverflow.com/a/17153598/1305139)
|
||
suggests the very same, but with some aliases:
|
||
|
||
{% highlight ini %}
|
||
|
||
[alias]
|
||
bisect-fixed = bisect bad
|
||
bisect-unfixed = bisect good
|
||
{% endhighlight %}
|