GIT: a Nightmare of Mixed Metaphors

Are you a regular user of the popular software version control system, git? If so, do you love it? If you do, then you are a perfect example of the miracle of neuroplasticity. Your brain – through an initially painful process – has grown new connections and adapted to a set of habits and associations that are twistedly unnatural in the scope of all tools created by homo sapiens.


Consider the following clash of metaphors:

“pulling from upstream”, “fetch”, “cherry pick”, “filter branch”, “untracked”, “symlink”, “rebase”, “tag”, “HEAD”, “working copy”, “head”, “path”, “stash”, “clone”, “submodule”, “fast-forward”, “merge”, “origin/master”, “staging area”.

Unless you are a surrealist poet, you will have a hard time generating anything of value with these terms. Alas…software developers are generally not interested in spinning narratives or crafting metaphorical microworlds. Of course, many programmers are interested in designing intuitive, self-consistent language in their tools. This would be awesome if they didn’t suck at it so very badly. In the case of git, it’s original creator, Linus Torvalds, appears to have demonstrated the classic negligence of an anti-design geek who has no time for wordsmithing.

Here’s the problem: if you are designing command-line tools, then wordsmithing is all you’ve got. It’s all just language.


I must admit: when someone sits down and explains how git works, and why it’s such a great concept, I see the light. These explanations are often accompanied by tree diagrams and arrows. This is encouraging.

And then I sit down and start using it. And the nightmare begins. All over again. Because the obscure language and cryptic behavior of git is impossible to remember, unless you use it every day. And who uses it every day? Git-lovers, of course. Their brains are soaking in the Koolaid from yesterday’s day on the job. There’s no mystery here.

Am I alone in my hate for git? Witness:

Here’s Mike Taylor on how opaque git can be, and why it is so confusing, especially to people who have not finished tying their brains into knots (i.e., they are still normal).

Here’s Steve Bennett, who says this about git: “What a pity that it’s so hard to learn, has such an unpleasant command line interface, and treats its users with such utter contempt.”

Here are some git-haters on Amplicate

Scott James Remnant sez: “I’ve had a few ex-boyfriends hang up on me before, and they were gits too.”

As I have always thought about version control systems in general: what is so very missing are good interactive visual tools that express the states and dynamics of a repository, and provide natural affordances. Mark Lodato is one of a small set of  explainers making an attempt to turn this cryptic language-pretzel into something that we can wrap our brains (and eyes) around:

But I think it will take more than just good visual-interactive tools to make version control a natural, pleasant part of programming with a distributed team. It will take a cultural shift in software development society. The people who are best-suited to design effective development tools are the very ones who are confused by the current pathological state of affairs, or repelled by it, or never even learned to program in the first place. I can’t blame them.