The following works:
git -C ~/dotfiles status
But this fails:
git status -C ~/dotfiles
Why is this?
This is because -C is a global option, and doesn't "belong" to the status action. This is a common pattern, resulting in synopses like the one below:
command [global options] action [action-specific options]
git --help lists Git's global options, and man git goes into more detail.
ls (using GNU getopts) treats - in ls foo -l as the long output option. BSD ls (using a different library), on the other hand, treats it as a filename argument.
git status -u which can't be flipped around to git -u status. And I figure a person who would ask this question might not be too familiar with command-line argument conventions in general, and so if they see something like du -s dir/ -h (GNU du of course) they might try to extract more meaning from that argument ordering than there really is. I just think it's easy to see one pattern or a few examples from one program and think all others work the same way, which is why I'd favor making the point that it really is up to the program.