Gitflow - Introduction
Tags: git, github, gitflow
Published: 2020-08-15 23:17:24

# **What is Gitflow?**


Gitflow is a Git Workflow that defines a strict model of branches, mainly oriented to **releases**, usually for large projects.

It is important to clarify that Gitflow doesn't add new concepts or extra commands. It only assigns specific functions to different branches.

## **Setting up**

Gitflow it's already included by default in Git, so, we can start a new project with Gitflow, put the following command in the terminal:

```powershell
git flow init -y
```

The `-y` flag, basically generate all the branches and prefix for us with the default names. But if you need a some custom prefix or different name of the main branches, you can delete the flag and answer the questions.

The output of this command is the following:

```powershell
$ git flow init
Initialized empty Git repository in C:/Users/ID139/Desktop/gitflow-practice/.git/    
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop] 

How to name your supporting branch prefixes?
Feature branches? [feature/] 
Bugfix branches? [bugfix/] 
Release branches? [release/] 
Hotfix branches? [hotfix/] 
Support branches? [support/] 
Version tag prefix? [] 
Hooks and filters directory? [C:/Users/ID139/Desktop/gitflow-practice/.git/hooks] 
$
```

Well, as we can see, Gitflow creates two branches:

- master
- develop

The second thing that Gitflow do, is set the prefix of the other branches like features, hotfix, etc. That's branches look like `feature/my_new_feature`.

# **Starting with Gitflow**

Like I've told you before, Gitflow has specific functionality for each branch.

Before to start, It's important to say that the **develop** is basically the full history of our project. The **master** branch would only be our production branch, this means that all the code in the **master** branch is functional, documented, and bug-free.

## - Feature Branch

Does your project need a new improvement? The **feature** branch is the one indicated. This branch is based in the **develop** branch, here we can do the commits of our new functionality.

### Start a Feature 

With the following command, we can create a new **feature** branch:

```powershell
git flow feature start <feature_name>
```

In `<feature_name>` you will specify the name for the new Feature. This will basically create the new branch, and assign it as the current or working branch.

At this point, we can start committing the new features for our project.

### Publish a Feature

As expected, surely someone works with you in this new Feature, therefore, it's necessary to send it to the main repository, you can do it with:

```powershell
git flow feature publish <feature_name>
```

### Finish a Feature

At this point, I suppose that your new functionality is finish. The next step is to finish our branch, basically, the **feature** branch will be merged with the **develop** branch.

```powershell
git flow feature finish <feature_name>
```

> Don't forget to do a `git pull` before finish the **feature**.

## - Release Branch

The **release** branch, basically allows us to create a "release" of the project, that's mean will be sending our project to a production environment. 

### Start a Release

To start a new **release** we need to put the following command in the terminal:

```powershell
git flow release start <release_name>
```

> The name of your branch is the name that will use the tag of the release.

After this step, you can start to commit your project. In this branch, we're expected to use for documentation and testing.

### Publish a Release

Same as above, we can publish our branch if someone needs to collaborate in the branch.

```powershell
git flow release publish <release_name>
```

### Finish a Release

In this point, all the project works fine. So, we need to finish the **release** branch.

```powershell
git flow release finish <release_name>
```
> Don't forget to do a `git pull` before finish the **release**.

Unlike other branches, the **release** branch will be unified with both **develop** and **master**. And they will be tagged.

## - Hotfix

The **hotfix** branch helps us to correct errors in production. This is the only branch that derives from the **master**.

### Start a Hotfix

The commands it's the same, but with the corresponding arguments.

```powershell
git flow hotfix finish <hotfix_name>
```

### Publish a Hotfix

If you need to send it to the main server or repository.

```powershell
git flow hotfix publish <hotfix_name>
```

### Finish Hotfix

Once the error is corrected, we must end the branch, it will be merged with **master** and **develop**. The **master** branch will be labeled with the version number.

```powershell
git flow hotfix finish <hotfix_name>
```

> Don't forget to do a `git pull` before finish the **hotfix **.


## Other Branchs

The previous branches are the main ones, or the most common. However, as you could see from the ** log ** when we started a project with git, we have some additional branches.

Which are:
- Bugfix
- Support

I hope this guide has helped you to learn a little about Gitflow, a very good tool for working in teams in my opinion. Anything you want to add is welcome.


Reference: [Gitflow Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)