The Concept of Gitflow
Thursday, June 25, 2015 5:15 AMHaving a collaborative environment is not only about being able to share and merge code without pain but also about being able to track versions, see who made what and easily see what is deployed to production and/or should be deployed. That's the main why we highly recommend and encourage you to use GitFlow in ALL the projects that you're involved in.
GitFlow model: Some concepts.
This model is based on assigning different roles to different branches inside the repository. There are 4 types of branches in GitFlow:
- Historical branches
- Feature branches
- Release branches
- Maintenance branches
Every type of branch has a different meaning, and they are used for different things.
Historical branches
The Git-Flow workflow uses two branches to keep track of the history of your project. While the master
branch holds the official release history, the develop
branch servers as the branch for integrating features. Usually all commits in the master
branch are are taged with a proper version number. I suggest to follow the rules of Semantic Versioning.
You'll never work directly on one of these to branches. Your workflow works pretty much around these two branches.
Feature branches
Each new feature is created in its own branch. Instead of branching off of master
, features are branched of from develop
. Whenever a feature is complettet, it gets merged back into develop
. When creating new features you should never work on master
or develop
directly
So if you work an a project that already has an existing codebase in develop
and you start working an a new feature, you have to created a new feature branch and branch of from develop
. As long as you work on this feature, you'll work against this feature branch. This will allow you to easy switch back to the develop
branch or stop working on a feature and start a new one without running into conflicts. Each feature should have a descriptive name like feature/career-api
that help you and other developer to figure out what this feature brach is all about.
Feature branches don't have to be pushed to the remote repository necessarily. After finishing the development of a feature, it need's to be merged back to develop
. For a cleaner repository you should delete the feature branch afterwards locally as well as in the remote repository.
Feature workflow in a glimps
- branch of
develop
- name feature branch
feature/feature-name
- merge back into
develop
- delete feature branch
Release branches
Once your develop
branch hold enough features ready for a release you create a new release by fork a new release branch off of develop
. The name of your new release branch follow the rules of Semantic Versioning (e.g. v0.1.0). When branching for a new release from develop
you initialize a release cycle, so no new features can be added after this point — only bug fixes, documentation generation, and other release-oriented tasks should go in this branch.
Once it's ready to ship, the release gets merged into master
and tagged with a version number. In addition, it should be merged back into develop
, which may has progressed with new features since the release was initiated.
Creating dedicated branches for preparing releases enables on team to polish and prepare a release while the other team is continuing working on new features. It is also nice to see release tasks like "this week we're shipping version 4.0.0" reflected in the repository
Release workflow in a glimps
- branch of
develop
- name release branch
release/v0.0.0
- tag release like
v0.0.0
- merge back into
master
anddevelop
- delete release branch
Maintenance branches
Fixing bugs and quickly patch production releases happens on Maintenace or hotfix
branches. This is the only branch type that is allowed to directly branch off of master
. Once a hotfix
is made, it should be merged back to master
and develop
or the current release
branch instantly. When merging a hotfix
back to master
it should be tagged with an updated version number (e.g. v0.1.1).
Hotfix workflow in a glimps
- branch of
master
- name hotfix branch
hotfix/xyz
- merge back into
master
,develop
and currentrelease
- tag master with new version number
- delete hotfix branch