Ione Souza Junior

Stop Wasting Hours! Git Bisect: Your Ultimate Bug Hunting Tool

June 07, 2024 | 7 Minute Read | Translations: pt | #git

Ever spent hours sifting through lines of code, desperately trying to pinpoint the source of a pesky bug? You're not alone. Debugging can feel like a frustrating maze, especially when you're dealing with complex projects and a history of numerous commits. But what if I told you there's a powerful tool that can help you track down the culprit commit in minutes, not hours? Enter Git Bisect, the secret weapon for efficient debugging. Let's learn about it now!

Imagine you’re working on a project with hundreds of commits, and suddenly, your code breaks. Instead of manually inspecting each commit, Git Bisect uses a clever binary search algorithm to quickly identify the exact commit that introduced the bug. This means you can say goodbye to endless hours of frustration and hello to faster debugging and quicker fixes. But how can it be possible?

Git Bisect is like a detective’s magnifying glass for your code. It helps you pinpoint the exact commit that introduced a bug, making debugging a breeze. Think of it as a binary search applied to your Git history. Don’t you know about binary search? You can find a lot of tutorials on internet, but I’ll try to explain here.

How Binary Search Works

Imagine you have a sorted list of numbers, and you want to find a specific number within that list. Binary search works like this:

  1. Start in the middle: Find the middle number in the list.
  2. Compare: Is the number you’re looking for greater than or less than the middle number?
  3. Cut in half: If your number is greater, discard the lower half of the list. If it’s less, discard the upper half.
  4. Repeat: Now, you have a smaller list. Find the middle number in this new list and repeat steps 2 and 3.
  5. Keep halving the list: You’ll keep cutting the list in half until you find the number you’re looking for.
  • Sorted List: The list must be sorted (ascending or descending order) for binary search to work.
  • Unique Elements: Ideally, the list should have unique elements, meaning no duplicates. This makes the search more efficient.

Now we know how the binary search works, let’s delve into the Git Bisect.

How Git Bisect Works

Imagine our Git repository as a timeline, with each commit marking a step in our project’s history. Think of this timeline as our sorted list, with each commit like an entry, ordered chronologically. When we need to find the specific commit that introduced a bug into our code, we can use the same efficient logic of binary search to discover it.

To use Git Bisect, we need to guide it by identifying ‘good’ and ‘bad’ commits. Think of it like playing a game of ‘hot or cold’. We tell Git which commit is ‘good’ (where the code works) and which is ‘bad’ (where the bug exists). This is similar to the binary search where you have to tell if your number is greater or lesser than the middle one. Based on this information, Git Bisect can then efficiently narrow down the search space, like choosing the lower half or upper half of a list of commits, until it pinpoints the exact culprit commit.

And, believe me: it works like a charm! I like so much this command!

Using Git Bisect in Practice

Now that we understand the concept of Git Bisect, let’s put it into action. Here’s a step-by-step guide to help you use Git Bisect in your own projects. Do you have a bug in your project? Try it!

1. Identify the “Good” Commit

Start by finding a commit that you know is working correctly (without the bug). This could be the last known working version, a specific release tag, or even a commit before you introduced the problematic feature. Remember, this commit should be before the point where the bug was introduced.

2. Identify the “Bad” Commit

Now, pinpoint the commit where the bug is present. This could be your latest commit, or any commit where you observe the bug. This commit should be after the point where the bug was introduced.

3. Initiate Git Bisect

Open your terminal and navigate to your Git repository. Run the following command:

git bisect start

4. Tell Git Bisect About “Good” and “Bad” Commits

Run these commands to mark your “good” and “bad” commits:

git bisect good commit-hash-of-good-commit

git bisect bad commit-hash-of-bad-commit

Replace commit-hash-of-good-commit and commit-hash-of-bad-commit with the actual commit hashes you identified in steps 1 and 2.

5. Git Bisect’s Suggestions

Git Bisect will now choose a commit somewhere between your “good” and “bad” commits. It will ask you to test this commit and tell it if the bug is present or not. Run your tests or manually check if the bug exists.

6. Provide Feedback

If the bug is present in the suggested commit, run:

git bisect bad

If the bug is not present in the suggested commit, run:

git bisect good

Git Bisect will then choose another commit based on your feedback and repeat the process.

7. Finding the Culprit

Git Bisect will continue this process of narrowing down the search space until it finds the commit that introduced the bug. It will display a message like “bisect: commit is first bad commit” to indicate the culprit commit.

8. Leaving Git Bisect

You can use git bisect reset to return to your original branch and review the code for the problematic commit.

9. Fixing the Bug

You can now fix the bug analyzing the culprit commit and test your changes. I like so much this approach, because you don’t need to look a lot of code and changes. Using Git Bisect you’ll find the specific commit that introduces the bug. This is smarter because the chance you solve the root of the problem increases.

Another interesting option using Git Bisect is to automate the test run. You can create a script and use it to run in every commit that Git checkout. This way you can automate and don’t need to make manual tests to do this. This is a way to use the Git Bisect “Like a Pro”, but I won’t talk about it in this post. If you want to know about it, tell me in the comments.

Embrace Git Bisect for Faster Debugging

In this post, we’ve explored the power of Git Bisect, a powerful tool for tracking down pesky bugs in your codebase. We learned that Git Bisect utilizes a binary search algorithm to efficiently narrow down the search space of commits, quickly identifying the one that introduced the bug.

By understanding how Git Bisect works, you can significantly streamline your debugging workflow. Git Bisect not only saves you time and frustration but also helps you develop a deeper understanding of your codebase and its evolution. Also, I believe it’s a safer way to fix things, because you’re focused on the root of the problem, not on side effects.

So, the next time you encounter a stubborn bug, don’t hesitate to reach for Git Bisect. Embrace the power of this efficient tool to quickly identify the problem and get back to building amazing software. Try using Git Bisect in your next debugging session. Share your experiences and insights in the comments below. Let’s make debugging a more efficient and enjoyable process for all developers!

Remember, mastering Git Bisect is an investment that will pay off for years to come. So, go forth and debug with confidence!

Happy coding!