GitHub FlowをCLIを含めたワークフローをまとめる

GitHub FlowをCLIを含めた簡単なワークフローにまとめると便利かなと思いまして、記事にまとめたいと思います。


# まず定義について

## GitHub Flowとは

> ・masterブランチのものは何であれデプロイ可能である
・新しい何かに取り組む際は、説明的な名前のブランチをmasterから作成する（例: new-oauth2-scopes）
・作成したブランチにローカルでコミットし、サーバー上の同じ名前のブランチにも定期的に作業内容をpushする
・フィードバックや助言が欲しい時、ブランチをマージしてもよいと思ったときは、 プルリクエスト を作成する
・他の誰かがレビューをして機能にOKを出してくれたら、あなたはコードをmasterへマージすることができる
・マージをしてmasterへpushしたら、直ちにデプロイをする
[https://gist.github.com/Gab-km/3705015](https://gist.github.com/Gab-km/3705015)


というように紹介されていた。

## 自分なりに上記をわかりやすくしてみると、、、

上記の紹介を、下記のような流れになるのではないかと自分なりにわかりやすくしてみた。

### 前提

- masterブランチ：常時デプロイ可能な状態にする

### 流れ

1. 「masterブランチ」から、「作業ブランチ」に作成
2. 作業ファイルに修正などの変更を加える
3. 「作業ブランチ」に変更を「コミット」
4. (フィードバックが欲しい時・ブランチをマージしても良い時)「プルリクエスト」を作成
5. 「レビュワー」が作成した「プルリクエスト」に対してOKであれば、masterへマージする
6. 「マージ」すると同時にデプロイする

# ワークフローをまとめる

上記の流れをCLIも含めて、実際に自分のリポジトリを使って試したので、手順を明示する。
下記のリポジトリにて行った。
https://github.com/jungissei/meal-share

## 1.「masterブランチ」から、「作業ブランチ」に作成

### カレントブランチがmasterブランチかを確認

```bash
$ git branch
* master
```

### masterブランチに今回の変更作業以外のコミットが含まれていないか確認

```bash
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
```

### masterブランチを最新の状態にする

```bash
$ git pull origin master
From github.com:jungissei/meal-share
 * branch            master     -> FETCH_HEAD
Already up to date.
```

### masterブランチから作業ブランチを作成する

```bash
$ git checkout -b modify_rails_dockerfile
Switched to a new branch 'modify_rails_dockerfile'
```

- 作業ブランチ名は、説明的な名前のブランチ名にする（例: new-oauth2-scopes）

## 作業ファイルに修正などの変更を加える

目的に合わせて、作業ファイルに修正などの変更を加える。
※今回は`docker/rails/Dockerfile`のファイルに変更を加えました。

### 変更したファイルの確認

`docker/rails/Dockerfile`が変更されていることを確認。

```
$ git status
On branch modify_rails_dockerfile
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   docker/rails/Dockerfile

no changes added to commit (use "git add" and/or "git commit -a")
```

### 変更内容をインデックスに追加

```
$ git add -A
```

## 3.「作業ブランチ」に変更を「コミット」

```bash
$ git commit -m "modify Rails Dockerfile"
1 file changed, 34 insertions(+), 35 deletions(-)
 rewrite docker/rails/Dockerfile (60%)
```

## 4.(フィードバックが欲しい時・ブランチをマージしても良い時)「プルリクエスト」を作成

### 変更をリモートリポジトリにプッシュ

```bash
$ git push origin HEAD
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 653 bytes | 653.00 KiB/s, done.
Total 5 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
remote: 
remote: Create a pull request for 'modify_rails_dockerfile' on GitHub by visiting:
remote:      https://github.com/jungissei/meal-share/pull/new/modify_rails_dockerfile
remote: 
remote: 
remote: 
remote: GitHub found 18 vulnerabilities on jungissei/meal-share's default branch (4 high, 10 moderate, 4 low). To find out more, visit:
remote:      https://github.com/jungissei/meal-share/network/alerts
remote: 
To https://github.com/jungissei/meal-share
 * [new branch]      HEAD -> modify_rails_dockerfile
```

### GitHub上でプルリクエストを作成

### 「compare & pull request」をクリック
![_2020-10-27_8.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261027/2d1a4b74-80af-93a7-ecf9-468c2fe3a2aa.png)



### 「Creeate pull request」をクリック
![_2020-10-27_8.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261027/22d8ca2f-7617-cc93-2d6c-8ed9fa0a5e34.png)



## 5.「レビュワー」が作成した「プルリクエスト」に対してOKであれば、masterへマージする

下記の画像ではCircleCIがエラーになっているが、このような時は修正し、再度コミットする。

その後、「Squash and merge」で「modify_rails_dockerfileブランチ」をマージする。

![_2020-10-27_8.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261027/8caf9502-6af0-e2da-d214-b6ce582b0fb1.png)


## 6.「マージ」すると同時にデプロイする

- マージされたら、CircleCIなどのツールで自動でデプロイする。

# その他気づいたこと

- masterブランチとdevelopブランチを設けて、developブランチから作業ブランチを作成するという流れもあるみたい(会社やチームによると思う)
- プルリク作成時の「Open  a pull request」ページでは、それぞれの会社やチームによってフォーマットがあるみたい
- Git Flowというブランチ多めの運用ルールもあるが、GitHub使っているならGitHub Flowが良いなと感じた。



# 参考

[GitHub Flow](http://scottchacon.com/2011/08/31/github-flow.html)
上記の翻訳文：[GitHub Flow (Japanese translation)](https://gist.github.com/Gab-km/3705015)
[Git+GitHub入門 #08：プルリクエストを使ったブランチ運用 GitHub Flow](https://youtu.be/xDMBBzWiSEI)