# GitFlow Guide
GitFlow is a way of structuring pull requests and branches, that intends to simplify the branching workflow in a larger project.
## The main branches
- **`master`**
- Where tags are pushed (release tags)
- represents the stable environment
- sometimes named `main`
- **`develop`**
- Where new additions and non-urgent fixes are added
- sometimes named `dev`
## Supporting branches
> Unlike the main branches, these branches always have a limited life time, since they will be removed eventually.
### Branches based from develop
- **`feature/[name]`**
- Branches with this prefix contains features
- merged to develop
- Ex: `feature/control-localization`
- **`bugfix/[name]`**
- Branches with this prefix contains unreleased bug fixes
- merge to develop
- Ex: `bugfix/required-validation-not-working`
- **`release/[name]`**
- Branches with this prefix are created to prepare an upcoming release
- merge to develop and master
- you should perform version bumbing if required
- the name must be the new version number
- the version should be minor or major update for features and patch for bugfixes
- Ex: current version 1.0.0 > major update > `release/2.0.0`
- Ex: current version 1.0.0 > minor update > `release/1.1.0`
- Ex: current version 1.0.0 > patch update > `release/1.0.1`
### Branches based from master
- **`hotfix/[name]`**
- Branches with this prefix are urgent to get to the stable environment to fix bugs
- merge to develop and master
- Considered as a patch version
- name could be patch version
- Ex: current version 1.2.3 > `hotfix/1.2.4`
# Semantic Versioning
Given a version number MAJOR.MINOR.PATCH, increment the:
1. MAJOR version when you make incompatible API changes,
2. MINOR version when you add functionality in a backwards compatible manner, and
3. PATCH version when you make backwards compatible bug fixes.
Additional labels for pre-release and build metadata are available as extensions to the `MAJOR.MINOR.PATCH` format.
You can't skip versions
- 1.0.0 > 1.0.1 ✔ - patch update
- 1.0.0 > 1.1.0 ✔ - minor update
- 1.0.0 > 2.0.0 ✔ - major update
- 1.0.0 > 1.0.2 ❌ - skip patch
- 1.0.0 > 1.2.0 ❌ - skip minor
- 1.0.0 > 3.0.0 ❌ - skip major
- 1.0.0 > 1.1.1 ❌ - skip patch 1.1.0
- 1.0.0 > 2.0.1 ❌ - skip pathc 2.0.0
- 1.0.0 > 2.1.0 ❌ - skip minor 2.0.0
---
# GitFlow in action
## Init new git repo
```ps1=
git init -b main # init git with default branch called main
git checkout -b dev # create dev branch
```
## Init in existing repo
1. Make sure to complete any old branches and clean the repo
2. Remove all branches except `main`
3. Create `dev` branch from main
4. Add latest version number as a tag on the main (Ex: 3.0.2)
## Create new feature
1. Create new branch `feature/[name]` from dev
2. Complete all changes (as much commits as you want)
3. Merge to dev (local merge or using a pull request)
4. Delete `feature/[name]` branch
## Create new bugfix
1. Create new branch `bugfix/[name]` from dev
2. Complete all changes (as much commits as you want)
3. Merge to dev (local merge or using a pull request)
4. Delete `bugfix/[name]` branch
## Create new release
1. After making some changes to dev `feature` or `bugfix`
2. Create new branch `release/[version]` from dev
3. Bump version number if needed and commit
4. Merge to main (local merge or using a pull request)
5. Merge to dev (local merge or using a pull request)
6. Add a tag with release version to main
7. Delete `release/[version]` branch
## Create new hotfix
1. Create new branch `hotfix/[version]` from main
2. Complete all changes (as much commits as you want)
3. Merge to main (local merge or using a pull request)
4. Merge to dev (local merge or using a pull request)
5. Add a tag with patch version to main
6. Delete `hotfix/[version]` branch
## References
- https://nvie.com/posts/a-successful-git-branching-model/
- https://github.com/petervanderdoes/gitflow-avh