I've been trying to improve my file synchronization setup for a while, and finally stumbled across Unison a few weeks ago. My requirements are pretty generic: I want to be able to work on projects from multiple machines, and also to have a backup of most of my files in case one of the machines dies. I don't mind using software that requires a central server, since I have plenty of places where I can set that up. I've tried out or considered several other synchronization applications, but they all had some problems:
I actually remember trying Unison before, several years ago; for some reason I ended up not liking it, and I think at that time I went with SparkleShare instead. But I can't remember the reason.
Anyway, on to what Unison actually does. It synchronizes two replicas, where both replicas may have modifications since the last synchronization. Synchronization is done manually, not continuously. Some versioning data is kept in ~/.unison, which I assume enables Unison to detect conflicts that the user can be alerted of for manual resolution. It's mature and robust, claiming that it is "resilient to failure" (with respect to crashes and such) and "has a clear and precise specification".
You can synchronize more than two machines by doing multiple synchronizations. I think it's best to have a central machine that you synchronize all other machines with; Unison probably still works fine if you synchronize arbitrary pairs, but this makes it easy to ensure all machines are up-to-date, and also means that e.g. you don't need to boot up your laptop to synchronize it with your desktop as long as the central machine is always online.
Unison synchronizes across an SSH connection (it also supports a few other protocols), so it's straightforward to get it working with a remote Linux server. You do need to install Unison on the remote end, since a client needs to be running in order to keep track of the versions and such; this isn't a big deal because a) there's both a CLI and GUI version, so you won't need to install X packages on the server, and b) the local client will somehow start up the remote client automatically, and only for the duration of the synchronization, so you don't need to worry about running anything in the background.
You add a profile by specifying the SSH details and local/remote paths. Once the profile is set up, you can immediately select it to compute differences and proceed with synchronizing the replicas. The synchronization window looks like this:
Unison informs you about all of the changes that will be committed, so you can double check if you're worried about it not doing the right thing. After looking it over, you just press the Go button and Unison begins copying the relevant files. Unison even implements a special compression protocol so that "transfers of small updates to large files are optimized".
I haven't been using Unison for very long, but I'm pretty happy with it and don't anticipate having any issues. Also in case it wasn't clear, Unison is free software, released under GNU GPL v3; the source code is on Github. There are Ubuntu packages for Unison (unison-gtk for the GUI, or just unison for the CLI), and binaries for OS X / Windows / Linux.