Как правильно деплоить сайт?
У меня в post-receive:#!/bin/sh
cd ..
env -i git reset --hard
Ну и в .git/config:[receive]
	denyCurrentBranch = ignore
Работает отлично, устраивает вполне. Прямо из IDE push в ветку production - и готово. 
Не думаю, что тут есть однозначный ответ что правильно, а что нет.
1) Можно использовать возможно IDE, например, Phpstorm имеет делать upload и показывать diff'ы;
2) Можно использовать хуки git, c использование центрального репозитория или как у nazarpc;
3) Можно использовать CI;
1 - удобен только, если команда - это 1 разработчик.
2 - достаточно просто настраивается.
3 - удобен, когда помимо копирования над кодом производятся ещё какие-то манипуляции.
2-й и 3-й варианты - неплохо бы уметь настраивать для общего развития.
PS "Правильно и удобно" - понятия относительные и субъективные.