Вот как бы я это сделал.
Каждый разработчик имеет свой собственный репозиторий git для разработки своего кода. Вы, как слияние, обладаете третьим хранилищем, и в этом хранилище есть отдельные ветви для каждого разработчика, для вашей тестовой системы и вашего рабочего сайта.
Ваши разработчики могут отправлять свои изменения вам, или вы можете извлекать их из них в ветки специально для них. У вас есть ветка, которой вы управляете, которая содержит объединенный код в состоянии для тестирования. Вы либо используете git-cherry-pick, либо, может быть, просто git-merge для внесения своих изменений в свою ветку тестирования, когда вы тестируете вещи (и, возможно, вносите свои собственные изменения - или отправляете отчеты об ошибках разработчикам, и вы повторно включаете их изменения). ). Когда вы счастливы, вы сливаетесь с «производственной» веткой. Обычно это изначально происходит из тестовой ветви, но с изменениями, необходимыми для работающей системы (я всегда нахожу, что есть что-то, даже если это просто имя базы данных и пароль).
Обычно я использую ловушку git с некоторым кодом, который проверяет, в какой ветке я нахожусь, и затем использую rsync поверх ssh для отправки кода на мой рабочий сайт.
#!/bin/bash
branch=$(git branch | sed -n s/^\*\ //p)
version=$(git describe --tags)
cd "$git rev-parse --show cdup)"
if [ "$branch" == "production" ]; then
echo "?php echo '$version';?>" > web/version.inc
rsync -axq --delete web/ site:public_html/
fi