On how individual devs deal with that, the alternative to the massive squashing is to me cherry-picking one’s changes against the upstream.
The bigger the branches diverge the more of a PITA it is to herry-pick, but it also means the feature being worked on is becoming too big/too much in conflict to be kept alive separate for long. My own target is 3 to 4 meaningful commits per-branch, excluding MR comments, and it works fine, mostly,