У меня в post-receive:
#!/bin/sh
cd ..
env -i git reset --hard
Ну и в .git/config:
[receive]
denyCurrentBranch = ignore
Работает отлично, устраивает вполне. Прямо из IDE push в ветку production - и готово.
Не думаю, что тут есть однозначный ответ что правильно, а что нет.