I would say that staging should be based on a git flow release branch. After a git flow release start
and git flow release publish
you can start QA work on that branch, including deploying it to a staging area. When the QA work in the staging area has proven the code ready for production deploy in production and do git flow release finish
.
If you are using TeamCity, you can easily set up the server to detect new remote release branches and automatically set up builds for them, see here.