How to Use Git-flow in Your Workflow
Published: 2022-08-31 22:41:23



Hi.
By now, am sure you know there are two principle ways to manage software projects and and optimize a team's workflow in GIT, i.e, `Git-Flow` and `Github Flow`, just in case you forgot.
In this article I will dwell on how to use Git-Flow.

**Git-flow** is simply a git branching model in which instead of having just one main branch, we can have two branches `main` and `development`. 
That sounds pleasant, Yes? 
I know, that's why I should be quick to mention that it has some paticluar use cases. According to _luca mezzalira (2014)_, Git-flow is suggested to be used when your software has the concept of `release` because it’s not the best decision when you work in **Continuous Delivery** or **Continuous Deployment** environment where this concept is missing.

In Git-flow: 
`main` tracks officail release history whereas, `development` allows for the integration of feature branches.

**TIP:** Tag all commits to the main branch with version numbers.

First of all one developer creates an empty develope branch and pushes it to the server.
	
	`$ git branch development`
	`$ git push -u origin development`

# How to make development branch the base branch
To change the base branch from `main` to `devlopement`:

- Head over to github.com
- On your repository, head over to settings
- Click on `Branches`
- Click on the `forward and reverse arrows` icon
- Choose `developement `in the drop-down menu
- Select 'I understand...'

Congratulations! You have just changed the base braanch of your respository from `main` to `development`

Now, other devs can then clone the central repository and create a tracking branch for `development`
Instead of branching off of `main`, feature branches branch off `development`.
That is to say, `development` is now the parent of feature branches.
When a feature is complete, the feature branch is merged back into `development`(This is what is known as 'Feature Branch Workflow').

**Spoiler alert:** Feature branches must never interact directly with `main`. 

# How to create a feature branch
To create a feature branch, head over to your terminal and enter the following commands:
	
	`$ git checkout developement`
	`$ git checkout -b feture_branch_name`

Or, you can use the git-flow extention library like so:

	`git flow feature start feature_branch_name`

You can then continue with the normal usage of Git.
When dvelopement work on a feature is complete, it's now time to merge `feature_branch_name` into `development` like so:

	`$ git checkout dvelopement`
	`$ git merge feature_branch_name`

Or using the git-flow extention like so:

	`$ git flow feature finish feature_branch_name`

Now assuming we have a repository already setup with a main branch, we can demonstrate Feature Branch Flow like so:

	`$ git checkout main`
	`$ git checkout -b development`
	`$ git checkout -b feature_branch_name`

Then run the following commands:
	
	`$ git checkout development`
	`$ git merge feature_branch_name`
	`$ git checkout main`
	`$ git merge development`
	`$ git branch -d feature_branch_name`

# Release branch
Once development has acquired enough features for a release, we can then fork a `release` branch off of `development`. 

The beauty of using a dedicated branch to prepare releases makes it possible for one team to polish the current release while another team continues working on features for the next release.

Release branches are based on the development branch. Below are a series of commands for creating a release branch:

Without the git-flow extensions:

	`$ git checkout develop`
	` $ git checkout -b release/0.1.0`

When using the git-flow extensions:

	`$ git flow release start 0.1.0`

You should be able to see some text that goes something like: "Switched to a new branch 'release/0.1.0'"

You can now merge release branch into main and development and delete the branch. 

To finish a release branch, use the following methods:

Without the git-flow extensions:

	`$ git checkout main`
	`$ git merge release/0.1.0`

With the git-flow extension:

	`$ git flow release finish '0.1.0'`

That's it!