The one-line summary: push into a remote repository that has a detached work tree, and a post-receive hook that runs git checkout -f.

Great how-to for putting a website under the control of git and avoiding some of the issues that can pop up when using git pull from your server is not an option.