Elements of a Grammar
Git has 160+ commands. Some are plumbing operations, such as
hash-object and write-tree. Some are porcelain commands, such as
commit and log. These are built on top of the plumbing commands.
Some porcelain operations could be thought of as combinations of other
porcelain operations. For example: pull is clearly fetch followed
by merge/rebase. cherry-pick is diff + apply + commit. I
like to think of rebase as a series of cherry-picks followed by a
reset.
Here's a challenge. Setting plumbing aside (we never want to break the abstraction), what basic commands would suffice to build an entire versioning system?
Think about it, write them down.