Well, it could be much easier.
You push to your staging server whenever you want, then, when you are happy to publish your code you push to the public server. In git you can have many remotes.
git remote add <name> <url>
Once you are happy you can push to stage server or push to public server, directly from the machine where you are working:
git push stage master:master
git push public master:master