GitHubのPullRequestの取り込み方まとめ

GitHubで別ブランチからのプルリクを取り込むには3つの方法があります。

[Create a merge commit], [Squash and merge], [Rebase and merge]です。

それぞれがどんな挙動になるのかよく分からなかったので[テスト用のリポジトリ](https://github.com/nametaketakewo/github-pr-test)を作って試してみました。


# まとめ


結論から言うと、
[Create a merge commit]は、2つのブランチの履歴をそのまま両方から受け継いだ新しいコミットを上乗せする

[Squash and merge]は、マージされるブランチの履歴を無かったことにして結果だけを纏めたコミットを上乗せする

[Rebase and merge]は、マージされるブランチ内での履歴を維持しつつ、それらを上乗せする

といった感じですかね、説明が下手ですみません、以下を見てもらえれば詳しくわかると思います。


# テスト方法
親コミットからそれぞれの"create-a-merge-commit"等の名前でブランチを切り(図中のhogeブランチ)、2つのブランチで交互にファイルを一つづつ追加してコミットしていきます。

そしてhogeブランチからmasterブランチにプルリクを飛ばしてそれぞれの方法でマージします。

ではやってみましょう!!

![IMG_0600.jpg](https://qiita-image-store.s3.amazonaws.com/0/51329/92983aa7-ca48-7378-b136-54aa32fc5033.jpeg)

とその前に最初に一応空のコミットを追加しておきます。ちなみに空のコミットはコマンドラインから"--allow-empty"オプションをつけるとできます。
<img width="1116" alt="スクリーンショット 2017-01-18 23.58.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/51329/3cb76444-cba8-2d33-47c9-dd40b54ced72.png">

## Create a merge commit


masterブランチとcreate-a-merge-commitブランチで交互にコミットした後です。

<img width="1116" alt="スクリーンショット 2017-01-19 0.34.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/51329/59aef66b-0bca-f7c0-0cde-3c95e9e8fefc.png">


こんな感じですね。デスクトップアプリだと上の直線の履歴の所に"マージしたよ〜！"って感じのマークが出てきて、左のコミット履歴ではマージコミットが新しく追加されてcreate-a-merge-commitブランチのコミットは消えてますね。

<img width="1116" alt="スクリーンショット 2017-01-19 0.36.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/51329/cd301a9a-d3aa-5924-fdb4-e84b2d9c3051.png">


ブラウザ上だと時系列通り交互にコミットが積み重なった後で更にマージコミットが追加されています。なんだかややこしいですね。

![スクリーンショット 2017-01-19 0.36.11.png](https://qiita-image-store.s3.amazonaws.com/0/51329/03714d1e-7f55-db09-6384-70e74a463c9a.png)


そしてこのコミットは"master 2"コミットと"create-a-merge-commit 2"コミットの2つを親として持っています。

![スクリーンショット 2017-01-19 1.39.48.png](https://qiita-image-store.s3.amazonaws.com/0/51329/0ac60117-60b3-8a6d-c39c-fbe8d5b51d23.png)



## Squash and merge


masterブランチとsquash-and-mergeブランチで交互にコミットした後です。

<img width="1116" alt="スクリーンショット 2017-01-19 0.41.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/51329/2b4111fb-be1d-69fb-83c9-1510c1ee431f.png">


デスクトップアプリだと左のコミット履歴ではマージコミットが一つ増えてますが、上の直線の履歴の所には普通のコミットとして記録されているようですね。

<img width="1116" alt="スクリーンショット 2017-01-19 0.42.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/51329/561a111e-7702-285f-3164-34bf5e88ffce.png">


ブラウザ上でもマージコミットのみ、squash-and-mergeブランチでのコミットは跡形もありません。

![スクリーンショット 2017-01-19 0.42.55.png](https://qiita-image-store.s3.amazonaws.com/0/51329/6228520a-a00f-1356-b77e-0dbb57462a68.png)


これを見るとブランチのコミットを全て一纏めにしてコミットを追加しているようですね。

![スクリーンショット 2017-01-19 1.40.02.png](https://qiita-image-store.s3.amazonaws.com/0/51329/8e28869b-57b8-f43f-2dc2-bda1cfbeccf9.png)


## Rebase and merge


masterブランチとrebase-and-mergeブランチで交互にコミットした後です。

<img width="1116" alt="スクリーンショット 2017-01-19 0.46.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/51329/a668721c-12d7-80ba-63c6-6873499929bb.png">


こちらでは時系列に関係なくマージされたブランチのコミットが親ブランチHEADの上に乗っけられてます。マージコミットは作成されないようです。

<img width="1116" alt="スクリーンショット 2017-01-19 1.28.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/51329/29137c88-c4ac-aa1c-59ef-7efe73bc3438.png">


これもデスクトップアプリとブラウザ上で見た目は変わりませんでした。

![スクリーンショット 2017-01-19 0.47.39.png](https://qiita-image-store.s3.amazonaws.com/0/51329/7a845e7e-61c6-c4fa-4d1d-9ded924f4739.png)


# 終わりに


それぞれで結構細かい挙動が違う事が分かりました。

個人的には[Squash and merge]を使ってmasterブランチは綺麗に保っていきたいなと思いました。

マージされてclosedなプルリクの詳細ページからマージ前のブランチのコミット履歴が全て見れるみたいですし(マージ後のブランチを削除した後でも!!)。


![スクリーンショット 2017-01-19 1.54.10.png](https://qiita-image-store.s3.amazonaws.com/0/51329/6fd63b4b-06b8-e895-4a36-18124cabd68c.png)


では皆さん、PullRequestsを活用して楽しいGitHubライフを👍