I am not sure what needs to be commented on at this point, since
it is not yet clear to me where you want your proposal to lead
us.
I do not agree with your "three commands" or "two semantics"
characterization of the current way "git commit" works. "git
commit" without any optional argument already acts as if a
sensible default arguments are given, that is "no funny business
with additional paths, commit just what the user has staged
already."
"git commit" is primarily about committing what has been staged
in the index, and "--all" is just a type-saver short-hand (just
like "--include" is) to perform update-index the last minute and
nothing more. In other words, "--all" is a variant of the
pathname-less form "git commit". It is not a variant of "git
commit --only paths..." form, as you characterized.
The pathname form (the "--only" variant) on the surface seem to
work differently, but when you think about it, it is not all
that different from the normal commit. We explain that it
ignores index, but in the bigger picture, it does not really.
In this sequence:
edit a b
git update-index a
git commit --only b
git commit --all
the first commit does "jump" the changes already made to the
index, but after it makes the commit, the index has the same
contents as if you did "git update-index a b" where you ran that
"git commit". In other words, it is just a handy short-hand to
pretend as if you did the above sequence in this order instead:
edit a b
git update-index b
git commit
git update-index a
git commit
So I actually think it is a mistake to stress the fact that "git
commit --only paths..." seems to act differently from the normal
"git commit" too much. It just helps to split the changes in
your working tree if the changes happen to be cleanly separable
at file boundaries (aka "CVS mentality"). When the changes are
not cleanly separable at file boundaries, the "more painfully
index aware" variant also allows you to spl...