To avoid to refresh the server each time you push, I suggest to use branches and to use this behaviour only with the master or production branches, with bitbucket you can restrict push on some branches, then you just have to make Pull Request to update your branch used in production. Doing this way, You'll be able to control the push that will restart the server.and avoid "shitty" push.
I think that can be a good way to do it in some projects, but for instance you are overrwriting all source code on poduction, by doing a git resert --hard, this cannot be done on some projects where the production server generates files or things that need to be saved on git, not erased.
But otherwise I think that's not a bad way!