Самый простой вариант такой:
1. Есть локальные файлы проекта. Если настраивается deployment (ftp), то файлы при правках льются на веб-сервер с проектом.
2. Есть репозиторий рядом с локальными файлами, в него делаются коммиты.
Посложнее, можно использовать сервер для хранения репозиториев (на самом деле копий локального репозитория, remote). Например, как писали выше, bitbucket. Или github, или gitlab. В этой модели сервер по прежнему ничего не знает, что у него git.
И самый продвинутый вариант, когда на боевой веб-сервер тоже устанавливается git, и поднимается локальный веб-сервер. На локальном ведутся работы, происходят коммиты. И когда делается push (или pull-request и дальнейший merge) на сервер с git репозиториями (bitbucket), там может автоматически срабатывать заранее настроенный обработчик события - hook, который дернет определенный скрипт на боевом веб-сервере, который в свою очередь делает git pull origin master.
В общем, если работа с проектом ведется в одиночку, и нужен контроль версия для себя - подойдет самый первый вариант.
Если хочется резервную копию репозитория где-то вне машины (или работа ведется эпизодически на разных машинах), то можно подключить bitbucket и делать push\pull\fetch с ним.
А если предполагается командная разработка, но нет технической возможности поднимать локальную копию проекта - то подходит второй вариант (мы часто работаем именно по такой схеме).
И третий вариант - самый сложный, обычно используем на техподдержке, когда есть "наша" копия сайта и "боевая". Т.е. на боевую копию не попадает ничего, без полного тестирования на нашей.