Basic common sense, and it also applies to git. With git, those regular up-merges are a lot easier.
Personally, I have been using git for years, and have never looked back at Perforce, but learning on more primitive VCSes taught me a disciplined, careful approach.
I did have to “unlearn” a few things (mostly, relaxing, and having more faith in the tool), but the transition has been fairly smooth.
[0] https://www.perforce.com/video-tutorials/vcs/mainline-model-...
If you changed a couple lines of code as part of a module refactor or something i.e. ongoing changes, then sure.
But if you were fixing a bug or doing some very specific thing, those are actually the times where hyper-specific contextual commits are necessary.
Git is this generic tool for which we still have not yet learned all the best practices and idiomatic usages.
Probably there should be a handful of types of commits, not more than 3-5 i.e. 'change' 'bug fix' 'upgrade' 'internal release' 'major release' (these are probably bad examples).
This is one of those insidious things that will only affect you. Nobody else has your working copy, and nobody cares what you do in it. But they will be doing their thing while you do yours, and to thrive in that environment, you can take advantage of tools.
(As for keeping PRs/CLs focused, it is sure nice when you hit some weird bug 3 months later and can identify the candidate commit with a bisect. You don't NEED the history to debug something; just debug it. But it can sure help with the "why" and "how" and get you from debugging to fixing much faster. Bisecting is at the top of our debugging checklist -- do it no matter what once you have a reproduction. It saves so much time that it's not even worth thinking about.)