История может быть испорчена с помощью rebase, но обычно удаленное репо не принимает изменения, которые изменяют историю (если вы не используете git push --force), но даже более того, разработчик с правами push может полностью удалить ветку (git push origin: branch-name). Итак, простые правила:
Не разрешайте push-разрешения разработчикам, которым вы не доверяете.
Когда репо является общим, не связывайтесь с историей, избегайте использования rebase на прошлых коммитах. Вместо этого используйте merge или cherry-pick, если вам нужно добавить что-то из другой ветки, в этом случае история не будет затронута.
Вы можете придерживаться политики не использовать 'push -f' для общего репо, и в этом случае разработчик будет знать, что если push отклонен, то что-то идет не так (скорее всего, локальная ветвь не обновлена удаленный) и должен решить проблему локально, а не принудительно нажимать.
Относительно вашего вопроса, как предотвратить - используйте Gerrit систему ревизий, это как промежуточный шаг на пути фиксации между локальным репозиторием разработчика и мастер-репо с хорошим веб-интерфейсом для ревизии, вы можете дать разрешения на передачу в хранилище ревизий кому угодно, но изменения будут объединены с вашей основной веткой после проверки и одобрения (что требует некоторых разрешений, которые вы обычно предоставляете основным разработчикам). Вы можете увидеть, как это выглядит в проекте Mahara: https://reviews.mahara.org В этом конкретном случае, только роботу-герриту разрешено нажимать на мастера (что является здесь ), и никому другому.