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.