I need help with the workflow that is best suitable for our needs. We are a 3-4 person team and are working on 4 different projects.

We have three main branches:

* master - *deployable production branch*
* staging - *features under QA on live data*
* dev - *features under QA on test data*

*Then for each feature, we create a feature branch*

What we need:

* Sometimes we would like to create a release (for many features that have something in common) and would be deployed in the end of the month.
* Sometimes we would like to deploy a specific feature/change (without creating a release). This is what we do most of the time.

Now to the workflow:

1. I start working on some feature. I create a feature branch off from dev.
2. I finish my feature (with 30 commits).
3. I squash merge my feature into dev - *so it becomes just one commit*.
4. The feature is automatically deployed to a testing environment and QA tests out my feature on *test data*.
5. The feature tested OK, so I cherry-pick my feature commit hash to a staging branch. The feature is automatically deployed to a staging environment and QA tests out my feature on *live data*.
6. The feature passes QA (test and staging) and is either cherry-picked to master or to a release branch, which will be merged with master in the end of the month.

Here's a picture explaining what I have in mind:
[![Workflow](https://i.stack.imgur.com/t3AOE.png)](https://i.imgur.com/nIRUWKQ.png)

Does this all make sense? Is there a better way to achieve this goal? Thanks for your time.