The value of a clean git history is often underestimated. I will explain one of the advantages based on the git bisect command.
The value of a clean git history is often underestimated. I will explain one of the advantages based on the git bisect command.
This isn’t really true.
git bisect skip
to skip commits that can’t be evaluated. So if you are tracking down the failure of testfoo
and this commit fails to build, you can skip it.--first-parent
to avoid testing inside a development branch. This way you can identify which merge caused the issue, even if other merges had broken commits.So it is easier in general if you have all working commits, but it isn’t necessary. Really as long as you have green history on your main branch you will be able to get good results without much effort. I would highly suggest using some sort of merge-queue based workflow to ensure that the master branch is always green.
I would generally prefer using
--first-parent
rather than forcing squashing. As smaller commits can be much easier to understand and the fact that commit IDs don’t change when being merged can make it much easier to manage stacked PRs and hotfix backporting.I agree that some stuff is easier when not squashing commits, but for the teams I’ve been working with I’ve felt that the pros of squashing outweigh the cons, but of course YMMV.
But I didn’t know about
git bisect skip
, thanks for the tip! But sincere question: What happens if there are e.g. three adjacent broken commits? If I have skip all three of those and the error was introduced in one of them, then git cannot tell me which commit introduced the error, right?Yeah, if the problem was introduced in the skipped commits or the commit after the skipped commits git won’t be able to tell the difference. It it will only be able to know that it was one of those N+1 commits.
But as long as most of your commits are green it should be easy enough to do the final narrowing.