Visual Studio 2015とGithubでGitflow（No.2）

# はじめに

本稿はリポジトリにGithubを、クライアントツールとしてVisual Studio 2015を、構成管理ワークフローにGitflowを利用する場合の、主にVisual Studioの利用方法を記載した記事になります。
GitのプラグインとしてのGitflowには一切触れる予定はありませんのでご注意ください。

本稿は「Visual Studio 2015とGithubでGitflow」の第二回目になります。
一回目のエントリーは以下になります。

> [Visual Studio 2015とGithubでGitflow（No.1）](http://qiita.com/Nuits/items/517c096755326055b8b6)

前回の流れは以下の通りでした。

1. 　Githubへリポジトリの作成
2. 　ローカルへクローンの作成
3. 　developブランチの作成
4. 　フィーチャーブランチの作成
5. 　フィーチャーブランチへリソースの作成とローカルリポジトリへのコミット
6. 　ローカルリポジトリのコミットのリモートへのプッシュ

今回はGitflowのキーとなる「プルリクエスト」から入り、以下の流れで記載します。

1. プルリクエストの送信
2. プルリクエストのレビュー
3. プルリクエストのマージ
4. フィーチャーブランチの削除
5. プルリクエストの却下
6. リリースとホットフィックス

# 前提条件
一応前提条件を

* GitクライアントツールとしてVisual Studio 2015 Communityエディションを利用します
* 事前にVisual Studio 2015 Communityエディションがインストールされているものとします
* リポジトリとして、Githubを利用します
* 事前にGithubのユーザ登録が完了していることを前提とします
* Gitflowのワークフローに対する知識を一定以上所持している方が読む前提として記述しています
* Gitflowのワークフローに関しては、以下のサイトを参考にさせていただきました！
> [Atlassian社さん Gitチュートリアル Gitワークフロー](https://www.atlassian.com/ja/git/workflows#!workflow-gitflow)

# プルリクエストの送信

本章ではGitflowの醍醐味でもある、「プルリクエスト」を送ります。
それでは、Githubのページを開いてください！

。。。そうなんです、「Visual Studio～」と銘を打っておきながら、第二回の今回はVisual Studioではなく、Githubを直接操作するところから始まります。
というのもプルリクエストは、もともとGitの標準機能ではなく、Githubが提唱してGitの拡張サービスとしてホスティングサービス側（Github側）に構築されたものだからです。
現在では、他のホスティングサービス（BitBucket）などでも一般的に採用されており、Github以外でも利用可能なケースが多いです。
ただ、Visual StudioからGithubへプルリクエストを送る機能は提供されていないため（拡張機能として提供されているかもしれませんが）、今回はGithubのホームページから直接プルリクエストを送ります。

それではGithubの該当リポジトリのページを開いてください。
以下の図の赤枠で括っている「New pull request」を押下してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/99262/74042222-a408-8928-720b-c3d89e13028a.png)

今回の変更は、新しいソリューションを追加したことです。
その追加は、「develop-create-new-solution」ブランチで実施しました。
上記のブランチの追加内容を、開発のベースとなる「develop」ブランチにマージしてもらうよう、プルリクエストを送ります。
このため、以下の画面の「base」側のコンボボックスで「develop」を、「compare」側のコンボボックスで「develop-create-new-solution」を選択してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/99262/e8a5e4c0-81ed-64a3-0579-d292388946df.png)

で、下に見えているLeave a commentにプルリクエストの内容を記載しましょう。

![No-0001.png](https://qiita-image-store.s3.amazonaws.com/0/99262/63f55acb-90f8-cef5-fe40-6bc20efdfd87.png)

で、これらの下のほうを見ていくと、developブランチとdevelop-create-new-solutionブランチを比較した差異が表示されているはずです。

![No-0002.png](https://qiita-image-store.s3.amazonaws.com/0/99262/3103afa1-75e7-8e53-4418-102eb8f5f679.png)

このままだと、全ファイルの差分が表示されていて見づらかったりしますが、「6 change files」と表示されている個所をクリックすると、変更のあったファイル一覧が表示されます。

![No-0003.png](https://qiita-image-store.s3.amazonaws.com/0/99262/ce0984ad-db1a-71ae-0f79-fb21219a7cb1.png)

変更リストと変更内容を行ったり来たりしながら差異を確認すると良いでしょう

確認後、問題なければプルリクエストを送ります。
以下の画面の「Create pull request」ボタンを押下しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/99262/90ace141-108b-b002-82a8-a534bf9bcda3.png)

これでプルリクエストの送信は完了です。

# プルリクエストのレビュー

本章からは立場を変えて、プルリクエストを送られた側の視点で記載します。

プルリクエストが送られると、Githubのリポジトリのトップに以下のように表示され、プルリクエストがあることがわかります。
![image](https://qiita-image-store.s3.amazonaws.com/0/99262/2d0a9fb5-7232-c5f2-7293-3cff12a91d48.png)

開いてみると、以下のように1件のプルリクエストがあることが見て取れます。

![No-0006.png](https://qiita-image-store.s3.amazonaws.com/0/99262/a75dfdb4-30d3-004f-9bea-8f02aec0079f.png)

では、該当のプルリクエストをクリックし、開いてみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/99262/abedcdb6-e113-28d4-bba3-492e705ee99a.png)

なかなかふざけたコメントですね。
何の目的でどんなソリューションを追加したのか書きやがれって話です。

まぁそこはさておき赤枠の部分を見てください。
![No-0008.png](https://qiita-image-store.s3.amazonaws.com/0/99262/ca0fd93e-e660-7207-ee0f-3a25ed2f28e1.png)

察するに（てか書いてありますが）、「develop-create-new-solution」ブランチを「develop」ブランチにマージしてくれというリクエストのようです。
このままGithub上でマージすることもできるのですが、あげられたプルリクエストの内容をレビューしてからマージするべきです。
プルリクエストを送るとき、レビューするとき、それぞれチームで決めたチェックリストに従って、必要要件の確認をすると良いかもしれませんね。（コードが規約を満たしていること、コンパイルが通ること、テストコードが存在し正しく実行されること。。。etc.）
今回はどういったチェックリストが必要かといった内容については割愛します。

では、Visual Studioを開き、「チームエクスプローラー」を開いてください。

![No-0009.png](https://qiita-image-store.s3.amazonaws.com/0/99262/6ef16253-e9cc-c705-bc57-055eab03fb9b.png)

「ブランチ」ボタンを押下します。
すると、下のように見えるはずです。

![No-0001.png](https://qiita-image-store.s3.amazonaws.com/0/99262/d108f645-6234-a748-eb8a-b19edbb4d9f3.png)

レビュアーは、まだ対象のブランチをローカルに取得していないため、「develop-create-new-solution」ブランチは「remotes/origin」側にだけ、存在し、ローカルには存在しません。
これを右クリックし、以下のように「チェックアウト」を選択します。

![No-0002.png](https://qiita-image-store.s3.amazonaws.com/0/99262/ddd39ff3-46e0-c978-9e48-3745cad7b010.png)

すると、ローカルにチェックアウトされましたね！

![No-0003.png](https://qiita-image-store.s3.amazonaws.com/0/99262/71dffe61-e4ad-981f-ade6-8654cf428eed.png)

では、「チームエクスプローラー」の上部にある「ホーム」ボタンを押下してください。

![No-0004.png](https://qiita-image-store.s3.amazonaws.com/0/99262/c63db1d4-c22a-5811-b5e2-3725b65431eb.png)

すると、ソリューションの欄に、追加されたソリューション「DrawingExt.sln」が表示されているはずなので、それを開き（ダブルクリックし）ましょう。

![No-0005.png](https://qiita-image-store.s3.amazonaws.com/0/99262/53e56b8c-220b-1a9b-7d4b-447e25ba71b5.png)

うまくいけば、以下のように追加されたソリューションが開かれるはずです。
開かれなかったら。。。なんでかな？開かれるはず！

![No-0006.png](https://qiita-image-store.s3.amazonaws.com/0/99262/4a6ad4d9-512e-1ea5-419c-0fde440ffcbf.png)

では存分に心行くまでレビューを実施してください。
問題ありませんでしたか？
ここでは問題なかったことにします。
問題があった場合は、別途末尾のほうに記載します。

# プルリクエストのマージ

では、プルリクエストに問題なかったものとして次へ進めます。
次のステップはフィーチャーブランチ（今回は「develop-create-new-solution」）をデベロップ（develop）ブランチへマージします。

手順としては次のように実施します。

1. ローカルの「develop-create-new-solution」ブランチから、ローカルの「develop」ブランチへのマージ
2. ローカルの「develop」ブランチのリモートへのプッシュ

ではまずは、「チームエクスプローラー」のホームを開き、「ブランチ」ボタンを押下してください。

![No-0007.png](https://qiita-image-store.s3.amazonaws.com/0/99262/139b6a46-0397-bfad-047d-5a7d40126bb9.png)

ブランチ画面が開かれたら、マージ先のブランチをチェックアウトします。
今回の場合、マージ先は「develop」ブランチですね。

![No-0009.png](https://qiita-image-store.s3.amazonaws.com/0/99262/4568cb6a-2cab-09ef-f1c4-1e8c61ec0e17.png)

「develop」ブランチをチェックアウトしたら、次はマージ元の「develop-create-new-solution」ブランチを右クリックして「マージ元」を選択します。

![No-0010.png](https://qiita-image-store.s3.amazonaws.com/0/99262/5226af22-9dce-2686-2be0-41a84befcdf4.png)

すると以下のような画面が開かれます。
「マージするブランチ」に変更があった「develop-create-new-solution」ブランチが表示されています。
また、「マージ先となる現在のブランチ」に「develop」ブランチが表示されています。
これらを確認したうえで「マージ」を押下します。

![No-0011.png](https://qiita-image-store.s3.amazonaws.com/0/99262/58842366-e10f-6092-f4de-dc6aecf0905a.png)

これでローカルでのマージ作業が完了しました。
次は、ローカルの「develop」ブランチをリモートへプッシュします。

「チームエクスプローラー」のホームを開き、「同期」ボタンを押下します。

![No-0012.png](https://qiita-image-store.s3.amazonaws.com/0/99262/679bdc4a-af23-cc78-3cad-b6595be89762.png)
すると、同期画面が開かれ「出力方向のコミット」に「ソリューションの新規追加」が表示されているはずです。
そうしたら「プッシュ」を押下すると。。。

![No-0013.png](https://qiita-image-store.s3.amazonaws.com/0/99262/330e5232-5490-4298-7670-902dbead1917.png)

以下のようにログが出力されて、リモートの「develop」ブランチへ変更がマージ（プッシュ）されました。

![No-0014.png](https://qiita-image-store.s3.amazonaws.com/0/99262/44ec1ce4-31fd-f2c7-3161-a7e87326a223.png)

では、Github側で本当にマージされているか確認しましょう。
Githubのリポジトリトップを開くと次のように表示されているはずです。

![image](https://qiita-image-store.s3.amazonaws.com/0/99262/1f8c4ae0-1b7d-de33-5101-95faf65f26fb.png)

赤枠の下のブランチを「develop」ブランチへ切り替えてみましょう。

![No-0012.png](https://qiita-image-store.s3.amazonaws.com/0/99262/8e4a6559-9344-0ece-3421-6d17428390cb.png)

無事にソリューションが追加されていることが確認できましたね！
これにてフィーチャーブランチのデベロップブランチへのマージは完了です。

# フィーチャーブランチの削除

さて、これまで新しいソリューション追加のためフィーチャーブランチ「develop-create-new-solution」を利用してきましたが、もう不要なので窓から投げ捨てましょう。

「チームエクスプローラー」 > 「ブランチ」を開き、ローカルの「develop-create-new-solution」ブランチを右クリックして「削除」を押下します。

![No-0013.png](https://qiita-image-store.s3.amazonaws.com/0/99262/159637a0-8942-9546-65c8-23d8ff022771.png)

続いて、リモートの「develop-create-new-solution」ブランチを右クリックし「リモートからブランチを削除」を押下します。

![No-0014.png](https://qiita-image-store.s3.amazonaws.com/0/99262/b98ade58-1921-f0cd-a338-959520d138f0.png)

確認ダイアログが開かれるので「はい」を押下します。

![No-0015.png](https://qiita-image-store.s3.amazonaws.com/0/99262/e1f04ce1-e1b0-7e79-1911-aa441a5c17b9.png)

以上でプルリクエストの処理はすべて完了になります。
Githubのリポジトリを開いてみましょう。

リポジトリのマージのためにOpenされたプルリクエストが、マージされたことで自動的にCloseされていることがわかります。

![No-0016.png](https://qiita-image-store.s3.amazonaws.com/0/99262/024c4277-69eb-d25e-314a-2f6a8900ee0e.png)

# プルリクエストの却下

ここまでのケースではプルリクエストを受け入れましたが、場合によってはプルリクエストを却下するケースもあるでしょう。
その場合、Githubのリポジトリから対象のプルリクエストを開きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/99262/0fd987a8-f4e9-6f4f-24d7-7f4c34b5475c.png)

適切なコメントを入力し、「Close and comment」を押下しましょう。
なお誤ってCloseしても再度Openできます。
まぁ、再度プルリクエストを送ってもらってもいいですけど。

# リリースとホットフィックス

あとは大きなトピックとして、リリース作業とホットフィックスがあります。
が、それらの作業方法は、すべてこれまで説明してきた

1. 新しいブランチの作成
2. 新しいブランチ上での作業の実施
3. 作業内容のローカルへのコミット
4. リモートブランチへのプッシュ
5. プルリクエストの発行
6. プルリクエストのレビュー
7. プルリクエストのマージ

で全て実施できます。
ブランチを作る元ブランチと、ブランチの目的、ブランチのマージ先が異なるだけです。
と言う訳で、ここまででVisual Studioを使ってGithub上でGitflowを適用する場合の、「なんのトラブルもなかった」場合の流れを説明できたと思います。
実際にはチームメンバー間で同一リソースへの編集が衝突した場合のマージ作業やリベースといった作業が必要になってきますが、その話はまた別途書きたいと思います。
ではまた、その時にお会いしましょう！