$ git fetch origin
$ git reset --hard origin/<production branch>
A rollback is just:
$ git reset --hard HEAD^
Fetching pulls down the new code, without replacing your production code just yet. Then git reset --hard is a super fast way to point the production server's working copy at the current head of the origin/<production branch>. Saves you the time of having to upload an archive of your entire app the server everytime. However, it also gets complicated if you want to rollback more than one deploy. I've been looking into maybe auto-tagging each deploy and using the tags for rollbacks.
Also, for uploading assets to S3 checkout s3cmd. It has a really nice sync command, that's basically like rsync for s3 --only uploads files that have changed.
[1] https://github.com/blog/470-deployment-script-spring-cleanin...