seeking git wisdom: to squash or not to squash

I guess this question has no correct answer, but I'd still appreciate any feedback.

I'm currently trying to find my personal preferred git style. There are a few things I'm sure about:

  • master is the stable, i.e. what's running on live (and what could be released at any time)
  • bug fixes and features should be done in topic branches, which might or might not be pushed to public (depending mainly on how long it takes to implement them)
  • We're using gitosis

When I'm done with a topic branch and about to merge it back into master, I see two options: Just merge it. Or use git rebase --interactive to squash all commits I did into one, and than merge that.

The plain merge has the advantage that a lot of small commits are easier to merge (or so I've been told). Plus it's easier to revert/bisect later. The disadvantage is a lot of clutter in the history / git log.

If I squash all of my commits into one, I can avoid that clutter (and one can write beautiful commit messages after an rebase --interactive). But than this single big commit might be hard to merge. And a lot of fine grained information is lost.

So, can you offer any insights on this question? (hm, and maybe I should post this on some git list or on stackoverflow.com...)

Original: http://use.perl.org/~domm/journal/38868

Legacy comments

hdp: do not squash (orignal post)

Once you throw away information, you can't get it back. Put the beautiful commit message into the merge commit if you must have it; I never find myself bothering. The "clutter" you mention is really a non-issue; git has powerful tools to browse/search history.

jdavidb: Re: (orignal post)

If you are like me, your topic branches are always rebased onto master frequently, and so when you merge into master you get a "fast-forward" commit: master (the pointer to the trunk of your tree) just suddenly points to the same commit as the branch you merged, and no new commit object is created.

This can be a little bit annoying, because there is no way to tell that the last $N commits were all merged from a branch and belong together as a set, and that the real previous state of your trunk (for certain p

daxim: Re: seeking git wisdom: to squash or not to squash (orignal post)

squash only commits that should have been a single commit in the first place.

pick deadbee add frobnitzers to lib/*.pm

pick fab4cab switch tests to new scheme

pick b00b135 oops, forgot files in lib/ subdirs

pick deadbee add frobnitzers to lib/*.pm

s b00b135 oops, forgot files in lib/ subdirs

pick fab4cab switch tests to new scheme

Aristotle: Focussed commits are better (orignal post)

What daxim said.

Also, another option is, if no one else has worked on the branch but you, you could rebase it onto master to linearise the history, making it easier to read.

But don’t squash entire branches in order to merge them. Focussed commits are easier to understand. They are also far more useful to git bisect.

If you feel the need for good merge commit messages, just write them yourself, as hdp said.