I'm comfortable with git, and recently learned mercurial, and I've concluded: commits are the wrong abstraction.
Work-in-progress and finished work are different concepts. Rebases and even branches are for WIP. Signing is for finished work. Timestamps and authors change for WIP.
miniblog.
Related Posts
It's weird how many languages represent tests as functions. They rarely take arguments and very rarely (never?) call other tests.
Is it the right abstraction?
Cases where it makes more sense to use concrete types rather than generics, even if you can be generic:
I'm not convinced that offering the staging area is a good default for git.
It's an abstraction that newcomers have to learn before their first commit. Subversion style "commit every tracked file" isn't as pretty (`git add` is general) but it's the common case.