SparkleShare gets notified of local changes to the data via inotify, then it waits until the filesystem activities settle and starts commiting and pushing the changes to the server via SSH. In order to know when new files are available, there is a server provided by the Sparkleshare developers where Sparkleshare creates a new channel for each repository so push notifications can be sent to every instance subscribed to the channel when files are changed. If this is not possible SparkleShare falls back to polling.
The server side is fully passive and doesn't know anything about SparkleShare at all, it's just a git repository.
Now some of my experience with the conflict management and binary files, this might be biased:
I've been trying to use SparkleShare for half a year now but I gave up last week. Everything goes fine until you make different changes on different devices while being offline. This nearly always resulted in me having to resolve the conflicts manually with my not that good git skills. As far as I know, when having a conflict, Sparkleshare tries to get the HEAD of the repository back to the commit that is common between both conflicting changes, then plays the commits from the server on top of it and then tries to apply the local changes, but I'm not sure about that and it didn't work for me. This problem in combination with some problems that git has with binary files that are changing, resulted in times when my CPU was at 100% regularly until resolving the conflicts manually. On one of my devices with a low ram environment, it couldn't even clone one of my repositories, because I ran out of memory reproducably.
I know you didn't ask for my advice on how to use SparkleShare, but I advise you not to use it with binary files and/or files that are changing rapidly like savegames, some config files etc.