There seem to be two different ways to distribute puppet manifests:
Centralized:
This involves running a central puppet master server which is periodically queried by puppet agents for changes.
Decentralized:
In this case there is no central puppet master server and manifests are distributed to the nodes some other way, for example via Git. Then a node runs
puppet apply
to apply the changes.
I would like to know what are the main differences between the two approaches and if any puppet feature depends on a particular approach.
It depends.
I use Puppet Enterprise, so out of the box, it's pretty well-equipped to handle the geographically-dispersed environment I manage. For me, I also leverage mcollective, which provides other benefits.
See what works for you. Everyone does this differently. I wouldn't use a Git approach unless you had a specific constraint. E.g. do it the Puppet way unless you have a reason not to.
I'm not 100% sure about others but stuff like exported resources definitely depend on having a puppet master with puppet DB.
I doubt there will be stuff that you can do with a decentralized architecture and not with a centralized one.