Subversion -- the website is a working copy of the production branch and I just do an svn update when changes need to be deployed.
The whole thing is wrapped up in a script that makes it possible to one-click deploy changes.
The biggest thing is the application is directory independent and auto-senses the host for database selection. This means that no changes are required to the application to run it in development, staging, or production.
Edit: Apache is setup so that no .svn directories are served. Given that most web applications go through a front-controller now, I'm hoping this isn't as much of a concern anymore.