Like most people have said here it depends on your project. However, I feel it would make more sense to share my approach.
So here's my workflow- there is a master branch, a development branch and other branches are 'featureX' or 'bugFixY'. master branch is always what is in production, tested and complete. 'development' is the branch closest to master but has changes that should be merged to master and deployed next. Anyone who starts working on a new feature should always branch out from development. Try not to fix things directly in development, a branch for every bug (unless its just way too small a fix).
Next, if a branchfeatureX gets ready and well-tested, I would merged it to branch development. So in a sense, development is also always production ready but has newer changes. Meanwhile before a deployment, if we have another branch bugFixY which is ready and tested, I would merge it in development. And once its time to deploy, I will simply merge development to master. It facilitates multiple fixes and features in one deployment while keeping it all unit sized and human-error proof.