【Git】GitLabで1人コードレビューごっこしてみた②(branch作成からMergeRequestまで)

##コードレビュー

前回の続きです。
【前回】：[【Git】GitLabで1人コードレビューごっこしてみた①(GitLab登録からCloneまで)](https://qiita.com/OKsaiyowa/items/ad6fd969d5de042a4f24)

[プルリクエストを使った開発プロセス](https://backlog.com/ja/git-tutorial/pull-request/03/)

`>>>引用`

>①[ 開発者 ] 作業対象のソースを clone または pull します。
②[ 開発者 ] 作業用のブランチを作成します。
③[ 開発者 ] 機能追加、改修といった開発作業を行います。
④[ 開発者 ] 作業が完了したら push します。
⑤[ 開発者 ] プルリクエストを作成します。
⑥[ レビュー・マージ担当者 ] 通知されたプルリクエストから変更を確認しレビューします。
⑦[ レビュー・マージ担当者 ] レビュー結果を判断し、必要ならば開発者にフィードバックします。
⑧[ レビュー・マージ担当者 ] レビューの結果、問題がない場合はマージします。
⑨[ レビュー・マージ担当者 ] レビューの結果、対応自体が不要となるなど、プルリクエスト自体が必要ない場合はクローズします。

**今回は②～⑤までです。**
⑥に進む前に一度マージまでしてしまおうと思います。

##ブランチを作成
MergeRequestを送るには、
リモートとローカルでお互いに紐づいた状態のブランチがそれぞれ必要です。
作成の仕方にはいくつか方法があります。

まずは作業したいディレクトリに移動しておきます。

```:作業ディレクトリに移動
cd "作業ディレクトリ"
```

###GitLab上でリモートにブランチを作ってローカルに登録
`GitLab`の`Branches`から`New Branch`すれば作れます。

その場合、ローカルでリモートの変更を確認する必要があるので、
`fetch`というのを行います。

---
####fetchとは？
>リモートリポジトリで更新された最新情報を
ローカルリポジトリに持ってくるコマンドのこと

【引用元】：[git fetchとは](https://qiita.com/takakuda/items/2123e37733445f69f0ff)

---

次に、下記のfetchコマンドを行った後に、
`git branch -a`してあげると
先程GitLab上で追加したリモートリポジトリが追加されています。

```:リモートリポジトリの情報を取得
git fetch
```

ローカルのブランチは下記コマンドで作成できます。
ついでに作業ブランチも作成したローカルのブランチに切り替わるので大変便利です。
**※checkout (チェックアウト)とは作業ブランチを切り替えることです。**


```:ローカルにブランチ作成、ついでにチェックアウト
git checkout -b ローカルに作成するブランチ名 origin/GitLabで作成したリモートのブランチ名
```


これで、masterをCloneしたリモートのブランチを、ローカルに登録することができました。

---

###ローカルのブランチを基にしたブランチをローカルに作ってリモートに登録
Git Bash上だけで完結させることが可能です。

基となるローカルのブランチに作業ブランチを移します。
一例として、ローカルの`master`を基に作ります。

```:作業ブランチをmasterに
git checkout master
```
ブランチを作成してチェックアウトします。

```:ブランチを作成してチェックアウト
git checkout -b 作りたいブランチの名前
```
これでローカルにブランチを作成したついでに作業ブランチを切り替えることができました。

`git branch -a`を行うと確認できます。

![GitLabCheckOut.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/c84740ab-439e-c597-fea0-8c5ed7d663a8.png)

最後に作成したローカルのブランチをリモートにPushします。

```:先程作成したブランチをリモートにPush
git push -u origin 先程作成したローカルのブランチ名
```

これで、リモートにローカルのブランチを登録できました。

---

###リモートのブランチを基にしたブランチをローカルに作ってリモートに登録

こちらもGit Bashだけで完結させるパターンです。

みんなで作業しているリモートのmasterブランチを
ローカルに作業用ブランチとして持ってくる工程なので、
今後チーム開発する際に、これは結構使いそうな気がします。(そうでもない？)

基本的にGitLab上でブランチを作成した後の作業と さほど変わりませんが、
このやり方は最後にリモートにPushする必要があります。

```:ローカルにブランチ作成、ついでにチェックアウト
git checkout -b ローカルに作成するブランチ名 origin/リモートのブランチ名
```

```:リモートにPush
git push -u origin 作成したブランチ名
```


##いよいよMargeRequest

MargeRequest自体はGUIでの操作なので楽勝です。(私がCUI苦手なだけですが、、、)

マージしたいブランチを選択した状態で、
プロジェクトの画面から`Create merge request`を選択します。

![GitLabCreateMerge.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/dd4510a5-3c69-68dc-79f7-810841e900bb.png)

---

※どのブランチをマージするかは下記画像箇所から変更できます。
![ChangeBranch.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/f7a17b1d-c8c3-fb75-44d9-f754df088112.png)

---

後は適当にタイトルやら内容やらを書いてRequestを送ります。

![GitLabMR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/d88f317f-9634-0488-7f29-8e494975ddfb.png)


本来はレビュー担当者がコードの差分を確認してマージするのだと思いますが、
練習なのでそのままMargeしてみます。緑の`Marge`を押せばOKです。

![GitlabMargeFinish.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/985a8aba-d491-e8c1-68c5-d3c944338062.png)

無事マージ完了です。

全く差分の無いブランチをマージしようとすると"まだ何も変更ないよ"みたいな説明文がでます。


##ブランチを消す
練習で何回もブランチ作っては消してを繰り返したので消し方もメモしときます。

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

```:リモートのブランチ削除
git push --delete origin リモートのブランチ名
```

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

```:ローカルのブランチ削除
git branch -D ローカルのブランチ名
```

###GitLab上でリモートブランチを消した場合

ただの`git fetch`では反映されませんでした。

```:ローカルに消えたリモートブランチを反映
git fetch -p
```

##偉大な参考リンク様

[リモートで削除済みのブランチをローカルからも削除する](https://qiita.com/rotomx/items/2c8693c11a070c00def1)
[git コマンド branchの作り方](https://qiita.com/TetsuTaka/items/5ab227a8bd2cd7106833)
[Gitのリモートブランチを削除するまとめ](https://qiita.com/yuu_ta/items/519ea47ac2c1ded032d9)
[Gitでローカルブランチを削除する](https://qiita.com/hogeta_/items/33d2334c9b1919bd5120)