Proper git workflow scheme with multiple developers working on same task
I can't really speak to the merits of the methods described in your post, but I can describe how we solved collaborative coding in the workflow we use at work.
The workflow we use is one of many branches. Our structure is thus:
Master is golden; only the merge master touches it (more on this in a bit).
There is a dev branch, taken initially from master, that all devs work off. Instead of having a branch per developer, we make feature, or ticket, branches from dev.
For every discreet feature (bug, enhancement, etc.), a new local branch is made from dev. Developers don't have to work on the same branch, since each feature branch is scoped to only what that single developer is working on. This is where git's cheap branching comes in handy.
Once the feature is ready, it's merged locally back into dev and pushed up to the cloud (Bitbucket, Github, etc.). Everyone keeps in sync by pulling on dev often.
We are on a weekly release schedule, so every week, after QA has approved the dev branch, a release branch is made with the date in the name. That is the branch used in production, replacing last week's release branch.
Once the release branch is verified by QA in production, the release branch is merged back into master (and dev, just to be safe). This is the only time we touch master, ensuring that it is as clean as possible.
This works well for us with a team of 12. Hopefully it's been helpful. Good luck!
I think still nobody actually answered the original question of how to collaborate in topic branches maintaining a clean history.
The proper answer is sorry, you can't have all that together. You only can groom your private local history, after you publish something for others you should work on top of that.
The best you could do in your particular case where server dev doesn't care about client dev changes is to locally fork client branches from dev/feature ones and rebase that part on top of server work just before finishing the feature —or relax your constraints and switch to a different workflow, as you did ;)