Granularity. =git= has fine and coarse commands. I use =git gui= quite regularly to add/commit/amend messages. Here is a list of commands I perform regularly: | cmd | occ | | | |------------------+-------+---------------------------------------------------------------+---| | git-format-patch | 1 | | | | git-patch | 1 | | | | git-reflog | 2 | | | | git-rev-list | 2 | | | | git-tag | 2 | | | | git-blame | 3 | | | | git-init | 4 | | | | git-gc | 5 | | | | git-prune | 5 | | | | git-for-each-ref | 6 | | | | git-bisect | 9 | | | | git-worktree | 13 | | | | git-am | 17 | | | | git-merge | 18 | | | | git-remote | 20 | | | | git-clone | 21 | | | | git-config | 27 | | | | git-stash | 27 | | | | git-revert | 28 | | | | git-mv | 47 | | | | git-rm | 52 | | | | git-show | 57 | | | | git-log | 89 | | | | git-cherry-pick | 111 | | | | git-ls-files | 117 | | | | git-clean | 126 | | | | git-pull | 152 | | | | git-grep | 240 | | | | git-submodule | 246 | | | | git-reset | 265 | I often do `git fetch ; git reset --hard` instead of git pull | | | git-describe | 301 | uh? probably my prompt | | | git-commit | 319 | | | | git-add | 393 | | | | git-fetch | 432 | | | | git-checkout | 555 | | | | git-push | 574 | | | | git-branch | 618 | | | | git-rebase | 682 | | | | git-status | 902 | | | | git-rev-parse | 17172 | command prompt | | What is the problem domain that git solves for me? My perspective is that I use git to: - keep up to date with most recent version of the software I'm working on, - ((git fetch ; git rebase or git reset | git pull) ; [git push --force-with-lease]) - make local changes safely w/ annotations (why) and rollback, - (git add ; git commit -m | git gui) - publish changes to automated test systems - (git push -u origin ) - prepare changes for review by colleagues, - split changes in atomic digestable micro changes - (git rebase -i origin/ ; emacs + git gui) - annotate changes with messages - (git commit | git gui) - publish changes for review by colleagues, - (git push --force-with-lease) - publish changes officially to the codebase (sync to main line, then publish) - grab lock for main line - keep up to date - command line (git merge --no-ff ; git push) | github merge (most often, so I can copy information) - - release main line lock That problem domain is almost entirely defined by the tool of version control itself, of which many tools exist.