Personally, I use staging area all the time to create a curated set of commits that make logical sense when putting them up for review.
My workflow is generally to keep a very messy history of `XXX` commits until I am happy with what I've come up with. Then reset back to the branch point and using the staging area to build up logical changesets.
I don't care about the history of my coming up with the solution, I care about presenting the solution in a way that makes sense to reviewers, including future me.
Later on, if I notice that I messed something up, I'll create a fixup commit and do an interactive rebase to squash it back into the correct commit.
It should be a crime for people to blindly stage everything. Cleaning up after my colleagues easily falls under the "lost cause" umbrella.
If I really care about things being fully correct at each commit, I'll do an interactive rebase and just stop and test on each commit.
Often they're disjoint enough that I'm confident that if the end result works, the intermediate commit works, as the sibling commenter mentioned. (Even if not, on many teams it all gets squashed anyway, the intermediate commit message just makes the Pull Request easier to review.)
I can also often easily comment out the uncommitted stuff.
Finally, if I'm really worried about it, after creating the intermediate commit I can just `git stash`, test it, then `git stash pop` and keep working.
The staging area is basically a half-baked, special commit that is easy to do manipulation on but hard to figure out what its actual state is (e.g., show me only the diffs that are in the staging area, or let me figure out what the hell is actually going on if I'm doing a complicated rebase). You know what would be better? Turn the staging area into a full, real commit and lower the friction of editing unpushed history to make it easy to move patch hunks in, out, and between these commits. It would help people who want commits to be atomic and therefore break WIP changes into multiple commits before publishing them for review.
And how would you stage & commit only a portion of the changes made to a file?
(Like the parents, I use the staging area daily, and I am quite thankful for its existence.)
I wouldn't. That code is untested, and I have a thing against committing untested code.
Git stash -p, on the other hand, allows me to select what code should be left in the working directory for testing, with no need for a staging area.
git commit those three files
That operation is still not implemented in git/fs, but it's planned.