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

  • 2019/1/21
  • 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 と、友達になっていきましょう!

Takato Ezaki

Takato Ezaki小中高の塾講師からエンジニア

投稿者プロフィール

福岡で Web 系のエンジニアをしています。

中高の理科教師免許を取り、起業に 2 年間トライした後エンジニアの道へ入りました。

化学反応の中では Belousov-Zhabotinsky 反応が大好きです。

この著者の最新の記事

関連記事

コメントは利用できません。

募集中!(o゜▽゜)o

エンジャパン
求む、社長!
follow us in feedly

コッチもヨロシク!





最近のネタ!

  1. 2019-2-18

    第9回ボルダリング部 ~まさかのワールドカップ優勝者登場!?~

    今回は、1月に開催されましたボルダリング部活動の様子をお届けします(`・ω・´)ゞ 今年もB-PU…
  2. 2019-2-18

    GitHub のプランを Pro から Free へダウングレードすると制限がかかる機能全 6 つ紹介

    GitHub のアカウントを Pro から Free へダウングレードしました! こんにちは、江嵜…
  3. 2019-2-12

    第三回リアル脱出ゲーム部~さよなら、僕らのマジックアワー~

    はじめに 2019年初のリアル脱出ゲーム部の活動が02/02(土)にありました! というわけで活…
  4. 2019-2-12

    第4回アウトドア部 ~まさかのみんな初心者!?~

    2019/2/2(土)、アウトドア部の4回目の活動!! 前回終了時点では、真冬だろうし寒いから室内…
  5. 2019-2-11

    target=”_blank” すると飛び先のサイトから情報取れるって知ってました?

    target="_blank" はリンク先を新しいタブで開くときの書き方ですが… こんにちは、江嵜…
ページ上部へ戻る