Проблема чисто организационная, вы должны запретить программистам вообще лезть в тестовую и продакшн ветки. Сливать что-то туда нужно дать права только конкретному человеку который отвечает за релизы(или например DevOps).
Приведу пример как это устроено у нас:
1. Три ветки, дев, тест, прод. В дев могут пушить все кто что то делают, так как у нас разработчиков не много то одной дев ветки хватает. В тест коммиты которые сейчас тестируются, в прод то что крутится в лайв версии.
2. Задача настроенная в CI мержит изменения из дев в тест. Запуск задачи происходит вручную(т.е. процесс полностью контролируемый и в тест не попадает ничего что не должно туда попасть).
3. После тестирования изменений тест мержится в прод, на ветку ставится тег с текущей версией(по спецификации
semver.org ) и начинается новая итерация разработки.
Для вас такой механизм может оказаться слишком простым(если разработчиков > 10), поэтому возможно стоит сделать несколько тестовых веток под каждую из фич и мержить их в основной тест уже после завершения тестирования этих фич.