自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

GitHub の Pull Request はマージ方法が 3 パターンあるって知ってました?

こんにちは、江嵜です。

GitHub の Pull Request つかってますか?

みなさん、 GitHub 使ってますか?

先日プライベートレポジトリの利用が無料で出来るようになりましたね!
これで、これまで
「プライベートレポジトリを無料で使いたいから GitLab (または BitBucket) にするかー」
みたいな感じだった方々も GitHub を使いやすくなりましたね!

さて、GitHub といえば Pull Request ですね。
他のサービスでも Merge Request 等の名前で同じような機能が提供されていますが、
要は git で平行して開発していたものを一つにまとめる作業 (これがマージ) の管理を
カンタンに実行できるようにする機能ですね。

この Pull Request、便利なのですが、実は隠し機能みたいなものがありまして、(GitHub 側としてはたぶん隠してるつもりないですけど)
皆さん割と知らないで使ってるんじゃないかなーと思います。

ということで、今回はこの Pull Request のマージ機能について、意外と知られていなさそうなところをご紹介。

※ 今回の記事は git の基本的な内容(ブランチとかマージとか)をご存知の前提でお話します。
git の基本内容については、解説サイトが多数ありますのでそちらをご参照ください。

3 通りのマージ方法

通常のマージ

Pull Request 使ったことがある方ならご存知ですね。

この画面。

今回、試しにテスト用のレポジトリを作成してみました。
今回編集内容は関係ないので特にお見せしません。レポジトリに README.md ファイルだけを置いて、
そのファイルに this is test. の文章を追加していくだけのコミットを増やしていきます。

ちなみに、この後の説明が分かりやすいように、コミットは 2 つ入れています。

SourceTree というソフトで樹形図を見てみるとこんな感じ

一番最初(下)の Initial commit から 2 回 README.md を更新した履歴がありますね。
master ブランチは Initial commit をさしていて、
更新内容は ezaki-patch-1 ブランチの方に入っています。

さて、この Pull Request を今からマージしていきます。
最初は普通通り、マージしていきましょう。

Merge pull request ボタンをポチ。

はい、マージされましたね。
左上のアイコンが Open から Merged に替わりました。

樹形図はこう。

マージされたので master の方にコミットが入りましたね。

これが普通の、よく使うマージ。

Squash and merge

スカッシュマージ。

ちなみに、squash とは 「押しつぶす」という意味だそうです。
どういうことかは、実際にやってみましょう。

先ほどのものに引き続き、 2 つコミットを作ってみました。
ezaki-patch-2 ブランチにはいっています。

では Pull Request を作ってマージをするのですが…
通常のマージとは、マージボタンの押し方がちょっと変わります。

マージボタンの右側にある下向きの三角形を押すと…

メニューが表示され、3 つの選択肢が表示されましたね!
そう、これが 「3 種類のマージ方法」です!

一番上の Create merge commit が、先ほど実施した普通のマージですので、
今回は二番目の Squash and merge を選択。

すると、緑色のマージボタンも Squash and merge と表記が変わりますので、
ここでボタンを押してみましょう!

樹形図を確認してみると…

なんと! 先ほどの通常のマージと異なり、ezaki-patch-2 ブランチは master へ合流していませんね!
しかし、 master は先ほどの ezaki-patch-1 の合流地点から進んでいるようです。

これは、 ezaki-patch-2 のブランチが持っていたコミットの内容全てを、
一つのコミットに集約して、 master ブランチにつなげているのですね!

こうすることによって、たくさんのコミットがあっても実際に master に入るコミットは 1 つだけになります。
この方が後からコミットを見やすくて良い、という方もいらっしゃるようで、こういったオプションがあるのですね。

ちなみに、これは GitHub 特有の機能というわけではなく、 git のコマンドからも同様のことができます。
興味がある方は調べてみてくださいね。

Rebase and merge

最後に Rebase and merge ですね。

これは名前のままなのでもしかしたらピンと来てらっしゃる方もおられるかもしれません。
実際に操作して、どうなるか確認してみましょう。

とりあえず、先ほど同様 2 つのコミットを作っておきました。

で、 Pull Request 作成ですね。

この時、先ほど同様下向き三角形をクリックしてメニューを出し、
Rebase and merge を選択しましょう。

これで、マージボタンが Rebase and merge になりましたね。

では、マージ!ドン!

樹形図を確認してみると…

先ほどの Squash and merge 同様、 ezaki-patch-3 ブランチは master に合流していませんが、
master ブランチにはコミットが増えていますね。

先ほどの Squash and merge と違うところは、先ほどは master ブランチに増えたコミットが 1 つだけだったのに対し、
今回の Rebase and merge では 2 つのコミットがあるということです。

これは何が起こっているのかといいますと、Rebase and merge をしたことで、
現在の master の先頭に ezaki-patch-3 のコミットをそのままごそっとコピーした、という形です。

こうすることによってコミットの内容自体は変更されることなく、
通常のマージで発生するような分岐・合流が見た目上なくなるので、
樹形図は一直線に伸びていく形になります。

見た目がキレイなので、これもまたこの形を好む人は結構いらっしゃいますね。

まとめ

今回の記事は、半分は「Pull Request のマージボタンの右側にメニューがあるの知らない人多いよね」
という事に気づいてもらいたかった、という事で書いたものになります。

このマージ方法についてはそれぞれの人の好みの問題ですね。

好きなものをつかえばいいのですが、
他人のレポジトリでマージをする際に、どの方法でマージするかというルールが決まっている場合もあります。
ということで、他人のレポジトリを触る場合にはちょっと注意してみてくださいね。

これからも色々触ってみて、 Git と GitHub と、友達になっていきましょう!

Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

アバター画像
takato_ezaki
記事一覧