GitHubで別ブランチからのプルリクを取り込むには3つの方法があります。
[Create a merge commit], [Squash and merge], [Rebase and merge]です。
それぞれがどんな挙動になるのかよく分からなかったのでテスト用のリポジトリを作って試してみました。
まとめ
結論から言うと、
[Create a merge commit]は、2つのブランチの履歴をそのまま両方から受け継いだ新しいコミットを上乗せする
[Squash and merge]は、マージされるブランチの履歴を無かったことにして結果だけを纏めたコミットを上乗せする
[Rebase and merge]は、マージされるブランチ内での履歴を維持しつつ、それらを上乗せする
といった感じですかね、説明が下手ですみません、以下を見てもらえれば詳しくわかると思います。
テスト方法
親コミットからそれぞれの"create-a-merge-commit"等の名前でブランチを切り(図中のhogeブランチ)、2つのブランチで交互にファイルを一つづつ追加してコミットしていきます。
そしてhogeブランチからmasterブランチにプルリクを飛ばしてそれぞれの方法でマージします。
ではやってみましょう!!
とその前に最初に一応空のコミットを追加しておきます。ちなみに空のコミットはコマンドラインから"--allow-empty"オプションをつけるとできます。

Create a merge commit
masterブランチとcreate-a-merge-commitブランチで交互にコミットした後です。
こんな感じですね。デスクトップアプリだと上の直線の履歴の所に"マージしたよ〜!"って感じのマークが出てきて、左のコミット履歴ではマージコミットが新しく追加されてcreate-a-merge-commitブランチのコミットは消えてますね。
ブラウザ上だと時系列通り交互にコミットが積み重なった後で更にマージコミットが追加されています。なんだかややこしいですね。
そしてこのコミットは"master 2"コミットと"create-a-merge-commit 2"コミットの2つを親として持っています。
Squash and merge
masterブランチとsquash-and-mergeブランチで交互にコミットした後です。
デスクトップアプリだと左のコミット履歴ではマージコミットが一つ増えてますが、上の直線の履歴の所には普通のコミットとして記録されているようですね。
ブラウザ上でもマージコミットのみ、squash-and-mergeブランチでのコミットは跡形もありません。
これを見るとブランチのコミットを全て一纏めにしてコミットを追加しているようですね。
Rebase and merge
masterブランチとrebase-and-mergeブランチで交互にコミットした後です。
こちらでは時系列に関係なくマージされたブランチのコミットが親ブランチHEADの上に乗っけられてます。マージコミットは作成されないようです。
これもデスクトップアプリとブラウザ上で見た目は変わりませんでした。
終わりに
それぞれで結構細かい挙動が違う事が分かりました。
個人的には[Squash and merge]を使ってmasterブランチは綺麗に保っていきたいなと思いました。
マージされてclosedなプルリクの詳細ページからマージ前のブランチのコミット履歴が全て見れるみたいですし(マージ後のブランチを削除した後でも!!)。
では皆さん、PullRequestsを活用して楽しいGitHubライフを👍






