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-4-17

    第8回 麻雀部活動記録~まるで個室のような雀卓で~

    3月末の桜が満開な季節に恒例の麻雀部を開催してきました! 例によって活動記録を書いていこうと思いま…
  2. 2019-4-15

    JetBrains の IDE に新色登場! IntelliJ でも PhpStorm でも新しい色を体験しよう!

    JetBrains の IDE に新しいテーマが作られていました! こんにちは、江嵜です。 みな…
  3. 2019-4-8

    やっぱり JavaScript (TypeScript) でも アノテーション (Decorator) 使いたい!

    JavaScript でもアノテーションしたい! こんにちは、江嵜です。 JavaScript …
  4. 2019-4-3

    2019年03月度社員総会&懇親会@Tokyo☆

    2019年3月15日(金)に、エージェントグロー東京オフィスの社員総会&懇親会が開催されまし…
  5. 2019-4-2

    第2回 倶楽部ぽじてぃぶ ~ボードゲーム~

    2019年2月23日に、第2回となる倶楽部ぽじてぃぶの活動が開催されました! 今回は、その様子をお…
ページ上部へ戻る

当サイトに掲載されているコンテンツ(文書、画像等)は、許可なく複製・転用等する事を禁じます。

「フェアネス方式」は、株式会社エージェントグローが日本国内において出願中の商標です。

当サイトでは最低限必要と考えられる場合において、会社名/サービス名/商品名などを記載している場合があります。
これらはあくまでも説明の必要性に応じて用いているものであり、各社の権利等を侵害を目的とするものではございません。
不適切と考えられる場合には、当社お問い合わせフォームよりご連絡ください。

当サイトでは®や™などの表記を省略させていただいております。