I’m using a common git repo that various projects inherit from.
When I start a new project, I clone the base repo. When making changes, I try to make them generic enough so I can push the changes “upstream” to the common repo and all the rest of the projects inherit the changes with a simple “git pull”.
However, I’m quite familiar with git, branches, cherry-picking, and conflict resolution* (git is quite good about figuring stuff out, but sometimes you’ll conflict with yourself simply because you want to do something small a bit different on one particular site, and keep the changes).
* Since I’m on Linux, I use “Meld” (which is also available on OS X and Windows, but there are other 3-way merge tools too). You may want to read a slightly old, but still good writeup which talks about the concept and demonstrates OS X’s developer mergetool and links to a few others.
If you have the sites version controlled (and you really should have them version controlled, BTW) and don’t want to deal with porting changes between them, you could just copy the files you care about around and check them in. But it’s really nice to be able to let the code flow between the repos and have all sites easily benefit from improvements without having to hand-copy files around.