And the data structure and model are solid.
But even understanding what is going on behind the scenes, I find git to be an unintuitive mess at the CLI issue.
Let me start by saying things that git got right:
- The dag structure is nice
- Recursive merges are good
- The data models and what goes on behind the scenes is solid.
- It is the most full-featured vcs I have worked with
However, I still have real complaints with the software These include fundamentally different concepts merged into the same label and the fact that commands may do many different things depending on how you call them. The fact that the concepts are not clear means that it is worse than a learning curve issue. One cannot have a good grasp of what git is doing behind the scenes because this is not always clear. In particular:
- In what world is a fast-forward a kind of merge?
- Is there any command you can explain (besides clone) in three sentences or less?
- What does git checkout do? Why does it depend on what you checkoout? Can you expect an intermediate user to understand what to expect if you have staged changes on a file, when you try to check out a copy of that file from another revision?
- What does git reset do from a user perspective? Is there any way a beginner can understand that from reading the documentation?
- In other words, git commands try to do too much at once and this is often very confusing.
- Submodules are an afterthought and not well supported across the entire tool chain (why does git-archive not have an option to recurse into submodules?)
These specific complaints come from what I see as a lack of clarity regarding what concepts mean and they indicate that those who wrote the tools did so at a time when the concepts were still not entirely clear in their own minds. In essence it is not that things are named in unclear ways but that concepts have unclear boundaries.
Some of this could be fixed in git. fast-forward could be referred to as a shortcut to avoid a merge rather than a kind of merge. Some could be fixed with better documentation (we could describe git reset by what the user-facing changes are, rather than the internal changes). Some would require a very different set of command layouts.