【🔰初心者向け】Git入門 [Git-flow, GitHub Flow, tag]

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はGitのブランチ戦略についてです。これに関しては会社によって正解が異なります。というより、明確な正解はないのかもしれません。今回は、有名な二つのブランチ戦略について解説します。

前回の記事は👇

https://qiita.com/ikemura-ren/items/485f8ea83015c078b3a6

:::note info
ここまでの記事でまだ出てきていないコマンドも紹介します。
:::

![3bfe2018-53d1-4dba-b0fd-2e56bb0ae910_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/c8f9d9e8-ebc9-4456-9765-d60ab25b289a.png)


## ブランチ戦略って？
まず、ブランチ戦略とは、ブランチの切り方や統合の仕方、開発のプロジェクトにおいてどう運用していくのかについての戦略です。

ブランチ自体が、開発者によって簡単に作れてしまう、切ったブランチからさらに切ることができると言った自由度の高い機能です。チーム開発において、適当にブランチを切ったりしていると、コンフリクトの温床になります。開発においてはルール化した方がスムーズな開発を行うことができます。

:::note info
特に昨今のCI/CD周りと組み合わせるには、Gitの上手な運用が必須なので押さえておきたいところです。
:::

いくつか王道なブランチ戦略がありますので、そちらを見ていきましょう。

## GitHub Flow
まずGitHub Flowです。これは小規模開発に有効で、数人でチーム開発を行う小さなアプリ作成時などに使うブランチ戦略です。ただ、中〜大規模開発系ではちょっと大雑把すぎるので推奨できません。

まず前提として、GitHubでリポジトリを作成すると、`main`ブランチが作成されます。

:::note warn
古い記事などでは`master`ブランチと書かれているものもありますが、現在は`main`で統一されています。`master`と書かれている記事はそのまま`main`と置き換えても良いです。
:::

さて、このGitHub Flowは、この`main`ブランチをリリース用のブランチとして利用、それ以外のブランチは開発用のブランチとして利用と、極々シンプルな運用方法です。

基本的な流れは以下になります。
#### ① `main`ブランチ（最新版）から開発用のブランチを切る
```Bash:mainブランチを元に開発用ブランチを作成
# 例えばログイン機能を作成するブランチの場合
git checkout -b feature/login

# 現在はswitchコマンドが推奨されている
git switch -c feature/login

```

:::note info
そういえば、ここまでの記事でブランチを切る際に`branch`コマンドしか使っていなかったので、ついでにブランチを作りつつ移動する方法を紹介します。
:::

- `git checkout -b ブランチ名`：`-b`をつけ、ブランチを作りつつそのブランチへ移動
- `git switch -c ブランチ名`：`-c`をつけ、ブランチを作りつつそのブランチへ移動

#### ② 作業用ブランチで開発を行う
作業用ブランチに移動ができたら、機能を完成させます。
コミットを終えたら、そのままブランチを`push`します。

```Bash:pushする
git push origin feature/login
```

#### ③ プルリクエストを作成して、レビューしてもらう
開発者はプルリクエストを作成して、レビュワーにレビューをしてもらいます。
レビュワーは機能やコードに問題がなければ、`main`ブランチにマージします。

プルリクの例👇（結構適当に書いてます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/f4ed907a-629b-4f7d-9b5f-770891db6f90.png)

#### ④ `main`ブランチにマージされたら、ローカルの`main`を最新版に
`main`ブランチが最新版になったので、ローカルでは`pull`を行います。

```Bash:ローカルのmainブランチを最新版に
git pull origin main
```

#### ⑤ 新しいブランチを切って次の実装へ

```Bash:次はサインアップ機能を作成
git checkout -b feature/sign-up
# or
git switch -c feature/sign-up
```

#### やることはこれだけ
ここまでがGitHub Flowの手順です。
シンプルが故に、迅速な開発が可能です。運用に迷うこともあまりないでしょう。

:::note warn
本当に小規模なアプリ専用です。TODOアプリやシンプルなチャットアプリ程度のものならこれで良いです。
:::


## Git-flow
さて、GitHub Flowがかなりシンプルで運用をしやすいことがわかりました。ですが、中規模から大規模開発においてはこの運用では大雑把すぎます。

王道なGit-flowを見ていきましょう。名前は似てますが、内容はかなり違います。

こちらのブランチ戦略では、`main`がリリース用であることは同じですが、最新版は常に`develop`ブランチになります。

基本的に`develop`ブランチから開発用のブランチを切ります。ここの命名はGitHub Flowとほぼ一緒です。

### 新規開発系

#### 開発用ブランチを切る
```Bash:開発用はGitHub Flowと一緒
# developブランチにいる前提です
git checkout -b feature/login
# or
git switch -c feature/login
```

#### 開発後に`push`する
`push`を行い、プルリクエストを作成する。
ここで注意点なのは、マージ先が`develop`ブランチということです。

![名称未設定7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/df0f09b1-4abd-4fc0-868a-2d97a60dde88.jpeg)

:::note alert
GitHub-Flowと違うので注意です！`main`ブランチに間違ってプルリクエストを送ると怒られちゃいます。
:::

### リリース時の準備ブランチ
新機能を実装して、リリースの準備を行う際に、リリース用のブランチを作成します。

:::note info
こちらは実際に行っている会社とそうでない会社で分かれる気がしています。うちの自社開発のアプリではリリース用のブランチを作っていないので。でも外部の開発案件等では作っていたりします。
:::


```Bash:リリース用ブランチを作成
# developブランチにいる、最新版の状態になっている前提です
git checkout -b release/v1.0.0
# or
git switch -c release/v1.0.0

# pushする
git push origin release/v1.0.0
```

その後、プルリクエストをマージしていきます。

#### タグ付け
こちらが結構重要になってくるのですが、ブランチにタグ（目印のようなもの）をつけていきます。リリースのバージョン情報のようなものです。

```Bash:タグ付け
# mainブランチ上で行う。
# -aで注釈付きタグをつける。（後述します）
git tag -a v1.0.0 -m "Release v1.0.0"

# タグをpushする
git push origin v1.0.0
```

:::note info
リリースのバージョンによって、`v1.1.0`とか、`v2.0.0`などをつけます。この辺りはアプリやシステムの状況、会社の方針によってバージョン管理はさまざまです。`v1.0`とか`v2.0`など、大雑把につけるときもあります。
:::


### 緊急時のバグ対応
基本的には`develop`が最新なのですが、本番環境にバグを見つけ、その対応を緊急で行う場合は、`hotfix`というブランチを`main`ブランチから切ることになります。

```Bash:hotfixの作り方
# mainブランチにいる、mainブランチが最新版である前提です
git checkout -b hotfix/login-fix
# or
git switch -c hotfix/login-fix
```
`hotfix`ブランチは、修正が完了したら、`main`ブランチに直接マージされます。

ですので、バグ解消が完了したら、**その変更を`develop`ブランチにも反映させる**ようにしてください。

### もう少し細かくブランチを切るなら
緊急時ではなく、まだ開発段階でバグが発生している箇所を発見した場合ですが、`bugfix`というブランチを作成するとわかりやすくなります。`feature`ブランチ同様、マージするのは`develop`ブランチです。

```Bash:bugfixの作り方
# developブランチにいる、developブランチが最新版である前提です
git checkout -b bugfix/AdminLoginBug
# or
git switch -c bugfix/AdminLoginBug
```

:::note info
ブランチの命名ルールは色々ありますので、ケバブケース、スネークケース、キャメルケースなど、調べて見てください。上記はパスカルケース（アッパーキャメルケース）で書いています。
:::

:::note warn
このbugfixはGit-flowに含まれている方法ではないので注意です。
:::

### ブランチの運用一覧
| ブランチ名         | 用途・役割                 |
|--------------------|----------------------------|
| `main（master）`   | 安定したリリース版を管理する |
| `develop`          | 開発中の機能を集約する       |
| `feature/機能名`         | 機能単位で開発               |
| `release`          | リリース準備をする           |
| `hotfix`           | 緊急バグ修正                 |


## ブランチ戦略一覧
| 名称（英語）                | 名称（日本語）                | 特徴                                   |
|-----------------------------|-------------------------------|----------------------------------------|
| Git-flow                    | Gitフロー                     | 明確な役割ごとのブランチ構成           |
| GitHub Flow                 | GitHubフロー                  | シンプルな`main`＋機能ブランチのみ     |
| GitLab Flow                 | GitLabフロー                  | 環境別（本番・ステージング）の管理に適する |
| Trunk-Based Development     | トランクベース開発            | 一本のmainブランチで迅速に開発         |
| Forking Workflow            | フォーク型ワークフロー        | OSS向け、外部開発者が多い場合に有効    |
| Feature Branch Workflow     | フィーチャーブランチワークフロー | 機能単位でのブランチ管理               |


:::note info
基本はGit-flowを元にしたブランチ戦略が主になっている会社が多いのかな？と思っています。
:::

## `git tag`について
`git tag`はコミットにタグをつけることができるコマンドです。
タグには二種類あって、以下になります。
- 軽量タグ
- 注釈付きタグ

基本的には注釈付きタグを利用した方が良いです。詳細が書かれないため。

```Bash:タグの使い方
# 注釈付きタグ
git tag -a v1.0.0 -m "Release v1.0.0"

# 軽量タグ（メッセージがつかない）
git tag v1.0.0

# タグの一覧を見る
git tag

# タグの詳細を見る
git show v1.0.0
```

実行結果👇
![名称未設定8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/bd7b49df-bf6c-4226-b4eb-3baf6a44ef11.jpeg)

:::note info
タグを利用して、`reset`コマンドで戻ったりもできます。
:::

```Bash:タグを消したい場合
git tag -d v1.0.0
```

## おわりに
今回はブランチの切り方、開発における戦略についてまとめました。
開発を行う上では必須な知識ですので、初心者の方はしっかり覚えていきましょう。
これらの技術を押さえる手っ取り早い方法はチーム開発を行うことです。スクールなどに在籍している方は積極的にチーム開発をしてみてください！