【GitHub】ブランチ管理法【git-flow】

# 0. はじめに
kazumakishimoto([@kazuma_dev](https://twitter.com/kazuma_dev))です！
`git-flow`を使った`ブランチ`管理法です。

## 0-1. 全体の流れ
> [1.git-flow準備](#1-git-flow準備)
> [2.git-flow開発](#2-git-flow開発)
> [3.git-flowリリース](#3-git-flowリリース)
> [Reference](#reference)

## 0-2. 本記事の対象者
- git-flowの使い方

## 0-3. 事前準備
- リポジトリ名やブランチ名は一例のため、適当に変更してください


# 1. git-flow準備
## 1-1. Homebrewインストール

```terminal:local
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

https://brew.sh/index_ja

## 1-2. gitインストール
```terminal:local
$ brew install git
```

## 1-3. git-flowインストール
```terminal:local
$ brew install git-flow
```

## 1-4. ローカルリポジトリ作成
```terminal:local
$ mkdir hogehoge
$ cd hogehoge
```

## 1-5. git-flow初期化
```terminal:local
$ git flow init -d
```

## 1-6. リモートリポジトリ作成
![kazumakishimoto_git_flow_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/e7ffee1e-b378-1b89-537a-070c5df500c9.png)

## 1-7. リモートリポジトリ追加
```terminal:local
$ git remote add origin https://github.com/kazumakishimoto/hogehoge.git
$ git push --all
```

# 2. git-flow開発

## 2-1. issue作成
![feature_test · Issue #1 · kazumakishimoto_git_flow_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/aa232024-d451-a188-63f1-d7896a3107b4.png)

## 2-2. featureブランチ共有
```terminal:local
$ git flow feature start hogehoge#1
$ git flow feature publish hogehoge#1
```

## 2-3. リモートのdevelopブランチをpull
```terminal:local
$ git pull origin develop
```

## 2-4. ローカル開発
```terminal:local
$ git add -A .
$ git commit -m "hogehoge #1"
$ git push origin feature/hogehoge#1
```

## 2-5. GitHubでPR作成
![kazumakishimoto_git_flow_test (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/2ac5a97e-9f09-9c7c-24de-0d701f6b12fc.png)
![Comparing develop...feature_test#1 · kazumakishimoto_git_flow_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/4153a2a4-508c-718e-f097-870c6aaabcfd.png)

## 2-6. GitHubでPRマージ
![test #1 by kazumakishimoto · Pull Request #2 · kazumakishimoto_git_flow_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/e7f41db4-7cab-a7c5-4114-6b78e5f22fc2.png)
![test2 #3 by kazumakishimoto · Pull Request #4 · kazumakishimoto_git_flow_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/68106875-b268-dc15-8308-ea705a81e1cc.png)
![test2 #3 by kazumakishimoto · Pull Request #4 · kazumakishimoto_git_flow_test (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/55ca1af7-42ed-97f0-23d6-40150e87678d.png)

## 2-7. ローカルdevelopブランチでリモートdevelopブランチをpull
```terminal:local
$ git checkout develop
$ git pull origin develop
```

## 2-8. マージ済みブランチ削除
```terminal:local
$ git branch --merged|egrep -v '\*|develop|master'|xargs git branch -d
$ git remote prune origin
```

## 2-9. GitHubでclose issue
![feature_test · Issue #1 · kazumakishimoto_git_flow_test (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/0a147288-d676-0159-42f6-3df87b31d295.png)


# 3. git-flowリリース
- Heoku側の設定は割愛

## 3-1. releaseブランチ作成
```terminal:local
$ git flow release start 1.x
```

## 3-2. releaseブランチ共有
```terminal:local
$ git flow release publish 1.x
```

## 3-3. releaseブランチ終了
- `⌘ + S`で保存
```terminal:local
$ git flow release finish 1.x
```
![Screenshot 2022-04-05 14.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/29ca2919-32bc-f9b0-ccf6-9a94956ab956.png)

## 3-4. releaseブランチタグ付け
- 追記後`⌘ + S`で保存
```diff:MERGE_MSG
#
# Write a message for tag:
#   ver1.x
# Lines starting with '#' will be ignored.
 
+ Merge tag 'ver1.x' into develop
```
![Screenshot 2022-04-05 14.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/edb7b3a9-b484-0ad6-89c7-60fb887906ff.png)

## 3-5. GitHubにpush
```terminal:local
$ git push --all
```

## 3-6. Herokuデプロイ
- ※CI/CDツール使ってる方は下記不要(CircleCIでの自動デプロイ方法は下記記事参照)
```terminal:local
$ git push heroku master
$ heroku run php artisan migrate:refresh --seed
```
https://qiita.com/kazumakishimoto/items/6aac32725ebea25acf35


# Reference

- Githubでissue管理して開発しよう - Qiita

https://qiita.com/fukubaka0825/items/c7710b4e87d478c8ba3b

- GitHubのissueを活用した、個人アプリの開発手順を書いてみた - Qiita

https://qiita.com/tkmd35/items/9612c03dc60b1c516969

- Git-flowって何？ - Qiita

https://qiita.com/KosukeSone/items/514dd24828b485c69a05

- git-flowを試す - Qiita

https://qiita.com/tanishi/items/09e72c65c0a0c9e1cc10

- git-flow･GitHub Flow 実践要点メモ - Qiita

https://qiita.com/thinkalot/items/a7e2c3a3cdf5b15879fd

- Gitでマージ済みブランチを一括削除 - Qiita

https://qiita.com/hajimeni/items/73d2155fc59e152630c4

- Git-flowをざっと整理してみた | DevelopersIO

https://dev.classmethod.jp/articles/introduce-git-flow/

- git-flowの使い方 - 第3章 Github Flow/Git-Flowを使った運用 - [SMART]

https://rfs.jp/server/git/03git/howto-git-flow.html

- git-flow cheatsheet

http://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html

- 【Laravel】CircleCI 2.1でPHPunit自動テスト × Heroku自動デプロイ

https://qiita.com/kazumakishimoto/items/6aac32725ebea25acf35