When to merge two specific branches is a policy decision for your lead/project manager. In my case, I don't have to deal with QA, Release, or Code Freeze, but that's just a peculiarity of being a tools dev in the game industry. But, here is how I would do it if I were asked to: Master: aka Develop. It is by and for the developers, and they control when things get merged into it. I see no reason why this branch should ever be frozen, but it should also never be broken (that's what feature branches are for). A dev should ALWAYS rebase their feature branch on master and test it before pushing to master/submitting a pull request. Feature branches: Created and deleted by individuals/teams as needed. Merged into master when the feature is "done" (ready for validation, QA, etc). QA/Freeze: branched off master from whatever commit is determined to be a release candidate. Bugs should be fixed on this branch and those fixes should be merged back into master asap. Release: QA/Freeze branch when it's deemed ready to ship. The branch name should probably include the version number (eg: "release_3-0-0"). Start a new QA branch for your next RC. Other branches (Production, Hotfix, etc) are basically just special cases of the above.