08:59 September 16, 2011

git vs. hg: the ultimate bikeshed discussion

After listening to the Mozilla and git talk at this week's all-hands and the ensuing discussion, I've decided that the git vs. hg wars are the ultimate bikeshed discussion since emacs vs. vi. You'll probably hear me complaining about git after this post, but I've decided that I no longer need to care about the issue.

Being realistic, I don't really care about VCS (much like editors). Like most programmers, I want to program and integrate my work with the work of others, so in that since I care that a VCS exists and that I can push and pull and what not. But the nuances of how it works....why would I care?

I do care about workflow. It probably irritates me more than it should when simple tasks are hard, but realistically a lot of my time is eaten by simple things gone awry and me having to manually pick up after them. In this sense, both hg and git are awful. I want to pull others changes, program, and push. Anything other than that is a waste of my time. Neither git nor hg particularly makes this easy. hg queues fit my brain better, and I've thought of some pretty interesting usecases for them, but in the hg queue vs git branch debate, neither opinion is wrong any more than painting a bikeshed blue vs.green is wrong.

Looking at the technical merits of the system, git is faster. And that's about it. The rest is all opinion. Neither is particularly nice to automate. Neither of them have particularly automatable workflow. As John O'Duinn points out, when many people argue for git they're really arguing for github, but honestly I think its mostly horrible too. I could go over a system I think is generally better, but honestly there's no point. I won't have time to program it, and even if I did, as long as the bikeshed discussion continues it doesn't really matter if there is something better or even different. Dogmatism has become the dominant moderator.

I realized today that the git vs. hg debate had nothing to do with the technical merits of the system. Rather it was a debate based on two non-technical concepts: how the programmer wants to work and the culture of git users vs. hg users. I'll take the latter first.

While I don't like git and constantly wonder why the fuck I have to type -a for each of my commits, I've learned to use it reasonably effectively as a programmer that doesn't really care about the guts of version control software. Mostly what I don't like is talking to proponents of git. Generally, they have presented git as unquestionably better, they haven't been interested or willing in understanding my problems with the software, they automatically assume that any problem I might have with git or github is a deficiency in me, and when I ask how to do something more than a trivial command in git they throw their hands up and walk away since its not their problem. This is the sort of attitude I hate to see in the open source community: elitism. The people that are more fond of hg, on the other hand, don't really care much about the innards of version control, are more willing to help, and are more willing to listen. In other words, they are more like me.

In a bikeshed discussion, eventually things break to sides mostly based on the "more like me" factor. Instead we pretend that this is a debate about version control innards. Programmers aren't excited about version control innards. The fact that so much debate happens about hg vs. git tells me that something is wrong in the same way that the vi vs. emacs war illustrates that they are both awful editors. Instead, its a debate about how people want to work. git branches vs hg queues, the github workflow vs. a more traditional workflow. Neither is right. Neither is complete. And the whole discussion is pretty pointless.

So I'm content to let the debate run its course. I continue to think that what people want on top of a VCS is a real tool to configure workflow both in the manner that their community works but also how they want to work. But we can't even talk about this until the hg vs. git debate is over. Otherwise the talk degenerates into "well, I'm happy that git does this" or "hg queues are a much better workflow". People won't be happy until they can work the way they want and not the way that whoever is in majority tells them they have to. I can't wait for this day until we can start talking about having real workflow with a VCS instead of the twin crap workflows git and mercurial give us. But I don't think that can happen until the bikeshed discussion is called.

As a passing shot at dead history, Linus once said that by using the same model as CVS that SVN was "the most pointless software ever written". If I were going to be as arrogant, I would claim that by not solving the workflow problem, by introducing a DAG database but not as a library, and leading to the rise of statements like "if you don't have a github account, you don't care about open source", that git is "the most pointless software ever written". But really, I bear no more ill will. I don't care about VCS. I just want things to work.