It's always been a UX problem and it's gotten much better.<p>Here's something I posted 7 years ago over on a reddit comment thread about it<p>---8<---<p>I've been running a git hater twitter account for years and have had git use me, or me use it, for 8. (<a href="https://mobile.twitter.com/githater" rel="nofollow">https://mobile.twitter.com/githater</a>)<p>I "grok" the concepts. I do not however, get the broken command line interface. How is an error message like this at all helpful:<p>git push -u origin master<p>error: src refspec master does not match any.<p>That's not even a proper english sentence.<p>Here's an example of the three counterintuitive undiscoverable ways to do one common thing that everyone wants; be able to push and pull from a branch without specifying it each time.<p>git branch m<p>THEN<p>git checkout m<p>THEN<p>git push -u origin m<p>OR<p>git branch --set-upstream=m origin/m<p>Or if you want<p>git checkout --track -b m origin/m<p>How do you push to a branch?<p>git push origin m<p>how do you delete a REMOTE branch?! Same thing, but prefix it with a colon<p>git push origin :m<p>How do you delete a LOCAL branch? Use a different command, with a different option<p>git branch -d m<p>Show useful information about tags? What about sorting them, by date. Sounds typical, common if you dare say... If you think it's in git-tag, your princess is in another castle. You need git-for-each-ref. Here's the simple to remember magic:<p>git for-each-ref --format="%(taggerdate): %(refname)" --sort=-taggerdate --count=10 refs/tags<p>So easy to use, no wonder it's number 1.<p>how do you rebase? It's a simple task!<p>git rebate --onto something commit id that is one before where you actually start from [ space, not 2 dots like everything else ] commit id where you want to end at ...<p>Great, now you are in a "detached head" state. So the rebase onto didn't actually rebase on to it ... yeah ... about that...<p>---8<--- (from <a href="https://www.reddit.com/r/programming/comments/3qt28h/xkcd_1597_git/cwi4eni/.compact" rel="nofollow">https://www.reddit.com/r/programming/comments/3qt28h/xkcd_15...</a>)<p>So in conclusion, the documentation was full of arcane discussions in domain specific jargon. The interface was wildly inconsistent and asymmetrical and the errors were cryptic and unhelpful.<p>Here's a fun one. If you just git init and then have multiple users start pushing, you know, like the documentation encourages you to do, the objects database files get the ownership of the person pushing upstream and then can lead to wildly cryptic intermittent permission denied errors because the database is actually just a bunch of unix files. Yes there's many ways to fix this, but that's not the point. Why is a deep dive discovery process needed to make basic things work in obvious ways? It's a Heathkit when all you need is a calculator.<p>When you expressed these complaints people would respond with theoretical introductions to branching and ASCII art diagrams.<p>It was all no good. I even tried some futile attempts over 10 years ago to contribute to clean things up.<p>The problem was I was unable to convince people deeply intimate with the codebase that there were hostile user patterns that could be alleviated with a bit of expository writing. All the cryptic jargon was utterly clear, exact and concise to someone who's spent 1,000 hours on the source. "Many people find these interface patterns confusing" was met with "we have academic level documentation with diagrams". Alright. Useless.<p>It's gotten a lot better though.