So, if Alice collaborates by pull/pushing with Bob, and Bob works by patches over email with Charlie, and David exchanges with Charlie and Alice - then what is the "true" state of the repository exactly?
The easy way out is that everyone pulls/pushes with github and we use that as "truth".
I don't understand all those people that romanticize "distributed" things but then just stop thinking about the practical implications of that...
This isn't actually true. The collaborators simply have to ... collaborate. It depends on what the goal is with the data being kept in git. Git doesn't tell you how to collaborate.
It could be that the group elects one person (e.g. Alice) to do releases, so, it stands that only that code which reaches Alice will ever get released. If that doesn't happen, you haven't collaborated correctly.
It could be that any one of the group could release, in that case you collaborate to get your commits to any of those people.
It could be that there are no releases ever made, and the group loosely exchanges their branches to build whatever interests them.