【Git Flow】チーム開発のお作法～GitHubとブランチ管理編【採用試験対策】

技術面以外で採用担当者の心証が爆上がりする知識ってな～んだ？
答えはチーム開発のお作法です！

ここではGit Flowを利用したブランチ管理の手順を紹介していく。
GitHubだけで完結するように組んでいるから、GitHubのレポジトリもレビュー対象になっている採用試験対策に◎。


:::note warn
あくまで筆者のチーム開発体験に基づくものだから、
実際の現場で使う時はその現場のルールを一番に優先してね。
:::

# こんな人を対象にしているよ
どこかの採用試験を受けるために、

* GitHubでのブランチ管理方法
* ブランチの種類と使い方
* チーム開発のお作法

を知りたい人。
特にfwywdの一次採用試験を受ける人は必見。

https://fwywd.com/news/recruitment-1st

# 前提知識
以下の知識があれば「なんじゃこりゃ」とならず読めるよう想定して執筆している。

* GitHubとは何か知っている人
* 「コミット、プッシュ、マージ、プルリクエスト」をざっくり理解している人
* Visual Studio Codeの基本操作を知っている人

# 使用するモノ一覧

* GitHub
* Git Flow
* GitHub Issues
* Visual Studio Code

# ブランチの種類と使い方
もう知ってるから使い方だけ知りたい、って人は
「[実際に試してみよう](https://qiita.com/emjo1804/items/9daea4cd42980f179032#%E5%AE%9F%E9%9A%9B%E3%81%AB%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)」へGO。


## Git Flowってそもそも何？
超ざっくり言うと偉い人が考えた「チーム開発のためのブランチ管理ガイドライン」。
ブランチに種類と役割を持たせてチーム開発をスムーズに進めるのが目的。
大人数で開発する際に力を発揮する。

:::note info
「えっじゃあ１人で開発するときには向いてないんじゃない…？」

その通り。
１～４人ぐらいの開発ではGit Flowの簡略版、
GitHub Flowの使用が推奨されている。

ここではあくまで採用担当者に「チーム開発のお作法、知ってます！」ってアピールすることが目的だからGit Flowを採用しているよ。
:::

## ブランチの種類
Git Flowで提唱されているブランチ + bugfixブランチを使用する。
### 主要ブランチ
GitHub上に常に存在させておくブランチ。
成果物をどこかに提出する時はこの２本のみリポジトリに存在しているのが理想。

| 名前 | 使うタイミング |
|:-:|:-:|
| main（旧master）  |  デプロイ時 |
|  develop |  開発中 |

大原則として、**上記２本のブランチに直接何かをコミットするのは避ける**こと。
サブブランチの作成元・マージ先となる。

### サブブランチ
開発中に使うブランチ。主要ブランチから作成する。
**主要ブランチにマージしたあとは削除**しよう。リポジトリに残す必要はナシ。

| 名前 | 用途 | 作成元 | マージ先 |
|:-:|:--|:--|:--|
| feature  |  何かの機能を追加する |  develop | develop  |
| release  | リリース・デプロイの準備をする  | develop  | main + develop  |
| hotfix  | **リリース・デプロイ後**のバグを修正する  |  **main** |  **main + develop** |
| bugfix  | **開発中**に見つけたバグを修正する  |  **develop** |  **develop** |

#### 補足: bugfixブランチ
Git Flowにはもともとbugfixブランチが存在しない。
だが少なくとも筆者が所属していたチームではどこも使用していた。

それはなぜか？
開発中にバグを見つけた時困るから。

bugfixブランチなしだと「開発中にバグ見つけちゃった。けど機能を追加するわけでもないし、featureブランチで切るのは変だよね。どうしよう...？」って場面に必ずぶち当たる。
そのためbugfixブランチにこの役割を担ってもらっている。

## 開発フロー
bugfixブランチも含めた開発フローモデルの１例。
![GIt Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/b2b03767-a96d-e025-fb65-91ca9fe6535d.jpeg)

# GitHub Issuesとは
すごく雑に言うと超高性能なメモ帳。色んな用途に使える。
今回はサブブランチと紐づけて、開発工程を読み手と共有する目的で使う。

具体的な作業は以下の通り。

* ToDoリストを作る
* リスト毎にブランチを切って作業する
* 作業が終わったらプルリクエスト時に対応するToDoリストと紐付けてIssuesを閉じる


# 実際に試してみよう
シミュレーション例として、[fwywdの一次採用試験](https://fwywd.com/news/recruitment-1st)を使わせてもらう。お題は「ポートフォリオサイトを作ろう」。採用試験に興味がある人はこの記事もぜひ読んでみてね。

[【Next.js＋TypeScript】fwywdの一次採用試験攻略ガイド～試験の流れ編【採用試験対策】](https://qiita.com/emjo1804/items/62dabbc059a94778fd25)

## １．レポジトリ作成
コードを書き始める前に、レポジトリとToDoリストを作成する。
[GitHub.com](https://github.com)からYour repositoriesに移動(アカウントがない人は作ってね）。

![1レポジトリ移動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/8fb7beda-65f7-a96f-0b8e-8dc86258e9cf.png)
RepositoriesのNewをクリック。

![2レポジトリ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/55e95fdd-4954-8a51-97a8-9a4faaa36735.png)

Repository nameを入力 → Create repositoryをクリック。

![３レポジトリ命名して登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/a33c4a52-9dd6-ebc6-f92f-7c2b13732a96.png)

この画面が出てきたら作成完了。
![4レポジトリ作成完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/c2e92597-a4de-c731-8931-724f51dd2cff.png)

## ２．GitHub IssuesでToDoリスト作成
ここでは例としてfeatureブランチのためのIssue「環境構築」を作成する。

上部メニューの「Issues」をクリック。
![5Issuesへ移動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/02a4f4b6-3204-5378-9a23-b9966a76b153.png)

New Issueボタンをクリックして新しいIssueを作成する。
![6NewIssue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/ea66da5b-bac6-faca-7769-963a905dd824.png)

ToDoリストの中身を書いていく。

* わかりやすく簡潔な題名
* わかりやすい説明

![7題名と説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/048d8c31-da38-f1c2-d17a-ae76d788ded0.png)

* タスクリスト（おおまかな所要時間付き）

タスクが完了するごとにコミットすることで「コミットのメッセージ何書けばいいんだろう」問題から解放されるし読み手にも伝わりやすくなって皆ハッピーになれる。

右上のチェックボックスみたいなアイコンをクリック。
![8タスクアイコンクリック (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/49806aaf-186f-d246-0900-197279ed55a2.png)

おおまかな所要時間（予想）付きでやるべきことを書いていく。
![8タスクリスト作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/7f32b34d-c44b-217d-6138-de6e3bc7ec4b.png)

「Previewタブ」を押して見た目を確認してから Submit new issueをクリックして作成完了。

![9プレビューで確認して作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/b0659e78-0d3f-1680-e43f-ffbd55844b11.png)

作成した後の画面。Issuesの題名とIDはサブブランチ名に使用する。
![10作成完了画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/f574ceb5-3e03-03a1-ccc4-aeb453ec9e4f.png)

この作業を繰り返してToDoリストを完成させる。内容は各自ご自由に！

## ３．主要ブランチの作成と設定
ここからはVisual Studio Code上で操作していく。Visual Studio CodeとGitがインストールされていて、GitHubとVisual Studio Codeの連携が終わっていることを前提に話を進める。

まだの人はここからインストールしよう。
[Git](https://git-scm.com/downloads)
[Visual Studio Code](https://code.visualstudio.com/)

### mainブランチ
スタート画面から左のファイルアイコンをクリック→「リポジトリの複製」をクリック。

![11リポジトリの複製.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/6761be4f-6cc5-6771-b224-b14b3eb023d8.png)

「リポジトリのURLを貼ってね」と言われる。リポジトリのURLをコピペしてEnter。
![12GitHubから複製.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/b55b7763-41cb-514c-14c3-e7499e48861b.png)

ローカルファイルの保存先を聞かれる。任意の場所を指定しよう。
筆者は「test」というフォルダを作成してそこを指定している。

![13フォルダ選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/f7494f33-70c3-6c5b-a672-3ca2a8fbcb3b.png)

クローンしたリポジトリを開く。ターミナルを起動してGitHubのコマンドラインをコピペ→実行。
![16ターミナル操作.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/2a4103ed-38a7-d668-d30f-4a1d98047c7a.png)

終わったらGitHubを見に行ってみよう。mainブランチが作成されていれば完成。

### developブランチ
Visual Studio Codeから作成。
![17develop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/b0d3fa99-bbaf-02c5-8b5b-5e630f5b3894.png)
作成し終わったらプッシュしてGitHubに反映させる。

またdevelopブランチをデフォルトのブランチへ変更＋mainブランチを保護しておこう。
やり方は下記の記事を参考にすると◎。

https://fwywd.com/tech/github-switch-default-branch

## ４．サブブランチの作成からプルリクエストまで
サブブランチの命名規則を、ここでは

**（サブブランチ名）/（IssueのID + Issue名）**

とする。
現場によって細かい違いがあるから、実務では現場のルールに従ってね。

<details><summary>※細かい書き方についての補足</summary><div>

本稿のシチュエーションでは、サブブランチ名に

* サブブランチの種類
* 紐付けるIssueのID
* このブランチで何をしようとしているのか明示できるタイトル（本稿ではこれをIssue名と同じものを使っているが、違っていてもOK）

が含まれていれば細かい書き方は各々自由にカスタマイズして大丈夫。
例もいくつか載せておく。

* 本稿の使用例: feature/#1環境構築
* 例１: feature/環境構築-1
* 例２: feature/1_環境構築
* 例３: feature-環境構築-1

:::note info
サブブランチ名に含めるべき内容は状況によって変化する。
自身の採用試験で何をサブブランチ名に含めるべきか不確かな場合は採用担当者に聞いてみよう。
:::

</div></details>


### featureブランチの作成例

| 名前 | 使うタイミング | 作成元 | マージ先 |
|:--|:--|:--|:--|
| feature  |  何かの機能を追加する時 | develop  |  develop |

試しに手順３で作成したIssue「環境構築」と紐づけるfeatureブランチを作成する。



![17.5作成完了画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/2320a448-a4e4-cc0a-2723-73b51254374b.png)
developブランチを元に「feature/#1環境構築」と名前を付けて新しいブランチを切る。
**mainから切らない**よう注意。
![18feature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/49da9c30-c07e-c14d-1915-332652f7a5c5.png)

タスクリストのうちの一つを終わらせてコミットしてみよう。
例えば一番上のタスク「Next.js + TypeScript新規プロジェクトを作成(0.1h)」が終わったとする。コミットメッセージをタスク名と同じにしてコミット。

![19commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/efa462e6-d764-004a-e186-ca5eb59fb35c.png)

GitHubのタスクリストにチェックを入れる。
タスクリストの中身を全て実装し終えたらプッシュしてプルリクエストを作成する。
**プッシュしないとGitHubに反映されない**ので注意。

![20check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/3820613b-67d8-0338-c537-764e542c337c.png)

### featureブランチのプルリクエスト例
GitHubから作成する。Pull requestsをクリック→New Pull requestをクリック。
![21プルリクエストへ移動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/2beade7e-588c-b4c2-3685-3f8387dd73cb.png)

マージ先を「**develop**← #1環境構築」にしてCreate pull requestをクリック。
![22プルリクエストを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/d415f7ff-0ef8-b687-3275-c792c9317f50.png)

対応するIssueと紐づけてクローズさせるため、「Closes (IssueのID)」を記述する。
ここでは「Closes #1」。記述したら Create Pull requestをクリック。
![23Issueと紐づける.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1845828/f35de83d-9b1e-829f-5593-a78cc693a100.png)

#### Q.手順通りにやったけどIssueが閉じられなかったよ？

> A.「Closes #id」は**マージ先がデフォルトブランチじゃないと機能しない**。
developブランチをデフォルトブランチに設定すべし。

上記の手順を繰り返して、作成したToDoリストを元に成果物を完成させる。

さらにもう一段階意識高く作るなら、
GithubのMilestone（開発期限）を使ってスケジュール管理したり、
Tag機能を使ってIssueの種類（bug/enchantmentとか）やバージョンを分類しておくとより現場のお仕事っぽくなる。

参考リンク集:
[【GitHub】Milestone, Issue, Pull Requestを関連付けて扱う](https://qiita.com/kodai_0122/items/18f7faa80f0302244c51#1-milestone%E3%81%AE%E8%A8%AD%E5%AE%9A)
[git tag と GitHub の Release 機能でプロっぽさを出してみよう](https://qiita.com/tommy_aka_jps/items/5b39e4b27364c759aa53)

# 提出前のチェックポイント
最後に、成果物を提出する前にGitHub上で確認しておくべきことを挙げておく。

* レポジトリの公開設定は適切か（public or private。private指定であればSettings→Manage accessで閲覧許可したい人を追加しておくことも忘れずに。)
* 不要なサブブランチが残っていないか
* READMEを書いているか、内容は適切か
* クローズしているはずのIssuesがオープンのまま残っていないか
* クローズしているはずのPull requestsがオープンのまま残っていないか

# おわりに
ここまで読んでくれてありがとう。
チーム開発のお作法は採用試験を受けるにあたって最もコスパよく採用担当者の心証をアップできる部分のひとつだと思うから、ぜひ実践してみてね。

ちょっとでもこの記事を気に入ってくれたならいいね！してオラに元気をわけてくれると嬉しいな。
他の記事も良かったら読んでみてね。
[【Next.js＋TypeScript】fwywdの一次採用試験攻略ガイド～試験の流れ編【採用試験対策】](https://qiita.com/emjo1804/items/62dabbc059a94778fd25)
[ 【Next.js＋TypeScript】Tailwind CSSの環境構築Q&A](https://qiita.com/emjo1804/items/503fd4d029168631a6b5)
[【Next.js + TailwindCSS】TypeScriptを使ってコンポーネントを作ってみよう【fwywd一次採用試験】](https://qiita.com/emjo1804/items/72c7c76581e60a0d611b)