Github Flowの覚書
Tags: github
Published: 2018-09-04 07:35:26

---
title: Github Flowの覚書
published: true
description: Github Flowの覚書です
tags: github
---

最近はRailsチュートリアルやProgateのRails講座をやっています｡お恥ずかしながら､あまり仕事で`git`を使うことが無かったので､Github Flowなどもよく理解していません｡というわけでProgateのRails講座をブラウザでやりながら､ローカルでもRails立ち上げて､1問ごとにブランチ切って自分でプルリク出して開発してみることにしました｡
やっていく中で結構覚えてきたので､メモとして残しておこうと思います｡

# Github Flowの大まかな流れ

大まかには下記のような流れです｡

1. masterブランチから新しくブランチを切る
2. 変更を加える
3. commitする
4. pushする
5. プルリクエストを出す
6. レビューしてもらう
7. 問題なければマージする(してもらう)
8. リモートブランチを削除する


# 詳細な手順

ここでは､プルリクエストの部分以外はローカルからコマンドでやる方法を記載します｡
新しい機能(new-feature)を追加します｡コマンドは全てプロジェクトのルートディレクトリで実行しているものとします｡


## ブランチの作成

* ブランチを切ってそのブランチに移動する
    * ブランチ名はチームのルールに従って､追加する変更がわかりやすい名前にする(Jiraなどのタスクナンバーにする場合も)
    * `git checkout -b new-feature`

```ブランチの状態
> git branch -a
  master #ローカルのマスター
* new-feature #現在のブランチ
  remotes/master #リモートのマスター
```

## 変更からプルリクまで

* 変更を加える
* commitする
    * `git add .`
    * `git commit -m "新しい機能を追加"`
* リモートブランチにpushする
    * `git push origin new-feature`

```ブランチの状態
> git branch -a
  master
* new-feature #現在のブランチ
  remotes/new-feature #リモートに同名のブランチが作成された
  remotes/master
```

* プルリクエストを出す
    * ブラウザでリポジトリを開き､リモートブランチ(new-feature)に対しプルリクエストを出す
    * pushした直後であればリポジトリのトップ画面に`Compare & pull request`というボタンが出ている
![Screenshot from 2018-07-22 23-03-34.png (49.9 kB)](https://esa-upload.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/7996/2018/07/22/30651/c8d95b28-59bb-457e-b20c-5ae1ffa18b97.png)
* レビュアーにレビューしてもらう

## 変更の取り込み

自身でマージする場合は[【自分でマージする場合】](#self)まで飛ばしてください

### 他の人(レビュアーなど)がマージする場合

```ブランチの状態
> git branch -a
* master
  remotes/master
  remotes/new-feature # プルリクのコミット
```

* ローカルの`origin/master`を更新する
 * `git fetch origin`

> 参考
[git fetchの理解からgit mergeとpullの役割](https://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921)

* ローカルにプルリクのブランチを持ってくる(リモートブランチからブランチを作成)
    * `git checkout -b new-feature origin/new-feature`

```ブランチの状態
> git branch -a
  master
* new-feature
  remotes/master
  remotes/new-feature
```

* ローカルの`origin/master`を`master`にマージ
    * `git merge master`
* [【自分でマージする場合】](#self)に進む

<a name ="self"></a>
### 自分でマージする場合

* masterに移動
    * ` git branch master`

```ブランチの状態
> git branch -a
* master #現在のブランチ
  new-feature
  remotes/master
  remotes/new-feature
```
* 変更(new-feature)を**ローカルのmaster**にマージする
    * `git merge --no-ff new-feature`

```ブランチの状態
> git branch -a
* master  #同じコミット
  new-feature #同じコミット
  remotes/master #一つ前のコミット
  remotes/new-feature #同じコミット
```

> `--no-ff`などのマージオプションは下記が詳しかったです｡
* [図で分かるgit\-mergeの\-\-ff, \-\-no\-ff, \-\-squashの違い \- アジャイルSEを目指すブログ](http://d.hatena.ne.jp/sinsoku/20111025/1319497900)
* [gitのmerge \-\-no\-ff のススメ](https://qiita.com/nog/items/c79469afbf3e632f10a1)

* ローカルのmasterをリモートにpushする
    * `git push origin master`


```ブランチの状態
> git branch -a
* master  #同じコミット
  new-feature #同じコミット
  remotes/master #同じコミット
  remotes/new-feature #同じコミット
```

## ブランチの削除

Github Flowに則るのであれば､リモートのmasterブランチは常にデプロイ出来る状態なので､この時点でCircleCIなどでビルドが走ってデプロイされるケースがあるかもしれません｡リモートとローカルのnew-featureブランチは不要になるので削除しておきましょう｡

### ローカルのブランチ削除

* `git branch -d new-feature`

```ブランチの状態
> git branch -a
* master
  remotes/master
  remotes/new-feature
```

### リモートのブランチ削除

* `git push --delete origin new-feature`


```ブランチの状態
> git branch -a
* master
  remotes/master
```

以上です｡実際に業務で使ったわけではないので､おかしな部分があるかもしれません｡(特にレビュアーの立場のところは実際にやってないので｡｡)
おかしな部分があればご指摘ください｡