My understanding of how this differs from simple feature branches:

  1. To start with, two branches exist named master and develop (the dev branch is derived from master)
  2. Developers create and work on feature branches from the develop branch in the usual way and these are merged back into the develop branch regularly via pull requests.
  3. If using semantic versioning, the minor number (2nd field) is incremented each time a backwards compatible feature is added. A non backwards compatible feature (breaking feature) would result in the major number (1st field) being incremented. 
  4. When it is decided that a release is due, a release branch is created from the develop branch. New features can still be added to the develop branch via feature branches in the usual way.
  5. A deployable artifact is built from the release branch and the artifact is deployed to the appropriate test environments.
  6. The deployed artifact is tested and any bug fixes are carried out on the release branch. Bug fixes increment the patch number (3rd field) of the semantic version number. NOTE: Only bug fixes can be carried out in the release branch. No features can be added to the release branch.
  7. When all bugs are resolved and the release is finalised, the release branch is merged into both develop and master branches and master is also tagged with the semantic version number.
Official doc:  https://www.atlassian.com/git/tutorials/comparing-workflows