Nine years ago, I wrote Git is a Harrier Jump Jet. And not in a good way, then followed it up with Still hatin’ on git: now with added Actual Reasons! Both posts evidently resonated with a lot of people, but also attracted a lot of constructive disagreement.
Prodded by a new comment from MiB this morning, I found myself writing a response that I think is worth reproducing and amplifying here.
My struggles with git have been well documented. One thing I didn’t touch on is its tendency to suddenly change the behaviour of core commands from release to release. I’ve got used, over the last months, to seeing this:
mike@thor:~/git/other/kindle-backup$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from ‘matching’ to ‘simple’. To squelch this message
and maintain the current behavior after the default changes, use:
git config –global push.default matching
I believe I may have said this before, but it bears saying again: a big thank you to all of you who have posted insightful comments, both here and on Hacker News, in response to my recent article on git and its followup. I say without a shadow of exaggeration that I’ve learned more about git from these comments than from anything else I’ve ever read about it. (Yes, a couple of the comments were borderline abusive, but I think three bad ‘uns out of 300 is beating the averages pretty handily.)
Anyway: among many excellent comments, this long one by Weavejester @ Hacker News was the best of them all. As I read this, I felt a grin creeping slowly across my face, and at one point I literally laughed out loud as I realised not just what he was doing, but how well he was doing it. With his explicit permission, I am reposting it here in its entirety, because it deserves a much wider audience. (The title of this post is also’s Weavejester’s, based on the title of an article about monads.)
Monday’s little diatribe on git seemed to stir up quite a bit of strong opinion, both agreeing with me and disagreeing. As is often the case, they two camps seem to be split about 50-50, which makes me happy. It means I can be confident that I’m not talking complete arse-gravy, but I have a good chance of actually learning something.
For anyone who wasn’t around on Monday, the substance of my post was “git is bad because I don’t understand it”. Or to paint myself in a slightly less bad light, “git is bad for me because it makes assumptions about how I work that don’t match how I actually work”. Or, to summarise the summary, “git is the work of Sauron Gorthaur, the Abhorred, servant of Morgoth Bauglir, the Dark Lord that was called Melkor, destroyer and despiser, the corrupt Ainu and corrupter of Arda”.
It may be true that a bad workman blames his tools …
… but so does a good workman, if the tools are crap.
And git is crap. No, wait — it is much more than that. It’s not just poor, it’s malicious. When Sauron allegedly poured all his malice into the One Ring, he must have retained some wherewith to poison the sweet well of version control. Ever he seeks to spread discord and confusion — and what better way than by the notions of local and remote branches and various kinds of links between them? Or the distinction between the working area, the repository and the freakin’ index — a concept that we’ve all got along without quite satisfactorily, thank you.