I got into the habit of using version control when subversion came out. It made development more peaceful for me to know that older versions were just a few commands away. When distributed VCS systems came out, darcs, fossil, mercurial, and git, these saved me the trouble of needing to setup a central server.


I settled on mercurial because python was/is my language of choice. For a long time Atlassian offered free hosting of mercurial repositories which made backups and publishing easy. Alas, overtime git has taken most of the mindshare and while finding hosting for mercurial isn't impossible today, it seems like git has become synonymous with version control.


Git and mercurial have a lot in common conceptually. There are tools to convert hg repos into git. Switching back and forth isn't hard, but the changes to the interface are annoying.

Command Comparison

hg git
init init
commit commit -a
log log
add add
stat status
diff diff
tag tag
update --rev [tag] checkout tags/[tag]
push push --tags
pull pull
merge merge
clone clone
identify describe --tags --always

Little Annoyances

In general my only gripe with git is that it makes some everyday things slightly more annoying than hg. Commit in hg is just commit but in git you have to specify -a or a specific list of filenames. To show the status you have to type out status. If you type stat git will, oh so helpfully ask you, "Did you mean status?" If the program is smart to guess that I meant status, maybe it should just do it. Mercurial has --updaterev to clone a repo and update a specific rev and identify to show the identity of the current commit. Both are commands I use in my CI script but were cumbersome to figure out the git equivalents.

Musings on the Future

None of those are big complaints, they're just little annoyances. But good user experience is made up of lots of little details that all come together. And given how much time we spend using these tools my guess is that eventually git's interface will be replaced with other tools. In fact it seems like Linus designed it with that intent (porcelain, etc).

I'm slowly transitioning my repos to git, simply because mercurial hosting is getting pretty hard to find and everyone seems to expect familiarity with git. But I'd like to work on a user interface that didn't annoy me.

I haven't used Magit but I've read the manual and heard nothing but praise for the interface. I'd like to try learning from it enough to create a similar interface for my python IDE.