ブランチのマージ
- fast-forward
- 取り込む側のブランチ(今回は master ブランチ)に変更がない場合
- マージによる変更がないので新しいコミットは作られず、そのままコミットが進む
- fast-forward でないマージ
- 取り込む側のブランチに変更がある場合
- マージによって変更が発生するので、マージしたことによるコミットが自動生成される
ブランチ同士を統合するマージの方法についてご紹介します。画面を共有します。
はい、ブランチが今は master から demoA と demoB ができた状態ですね。まずこちらです。今、私の環境では master というブランチから派生してdemoA というブランチと demoB というブランチが出来上がりました。今、これは「master があって、demoA がありますよ、demoB がありますよ」と。で、この三つは、何と何が合体させてもいいです。このブランチとブランチを合体させる事を「マージ」と言います。
そうですね、作業が分かれて進むのは非常に良い事なんですけども、最終的には一つの、例えば Web サイトとか Web アプリとか、何かしらのプログラムの塊になりますから、分かれたものは、どこかのタイミングで合体しないといけません。
別れる時がブランチ、合体させる時はマージという形になります。では行ってみましょう。
fast-forward
まずはシンプルな fast-forward と呼ばれる「前に進むだけのマージ」をやってみたいと思います。今、このmaster からdemoA demoB どちらもそうなんですけども、master は同じ所にいて、そこからmaster 側からだけでみると、例えば demoB は一個前に進んだだけなんですよね。で、demoA についても、ただ前に進んだだけという形になります。
ですので、この、ただ前に進む状態のマージのことを fast-forward とかっていうふうに言います。「前に進ませるだけ」みたいなイメージです。
取り込む側のブランチを決める
やり方は、まず「誰として何をマージしたいか?」って事の、まず「自分」がどこか?という事を決めます。今回は master 側で demoB をマージする事にしましょう。今の、このままですね。ここの master さんに対して、demoB を合体させましょう、という行動をとりたいと思います。
なので、まずは「自分がどこで誰を取り込むか?」の「自分」になりましょう。今は master から取り込みたいので master を選択して master に切り替わった状態でいます。で、フォルダの中身を見てみると、master の時にはファイルが何も増えてない状態でした、という形です。
で、demoB のコミットでは demoB.txt というの追加してる状態、という事になるので、master と demoB が合体した時には、「自分 / master でも、 demoB と同じように demoB.txt が増えた状態」になる、というのが合体した状態という事になります。伝わります?demoB でやった作業分が、master にガチャンって合体するので…、ということですね。
master に demoB をマージする
では、やってみましょう。master に自分を切り替えたら、今度は「マージ」というボタンを押します。マージ。はい。で、マージしたいコミットの場所を選びます。今回は demoB ブランチと合体したいので、この demoB を合体させる、ということで、これを選択します。ここですね。demoA ではなくて demoB です(※Windowsの方は図1を参照)。
このように「どこのブランチをマージさせますか?」っていうのは、自分でこうやって見栄えを確認しながら、この SourceTree 上で見ることが可能です。では、ここを選んだら OK を押します。これでマージされます。はい。
このように、今、分かりますかね?master がこの分岐の所にいたのが、前側に進んだのが分かります。これ、なんか、せっかくブランチ別れたんだから合体してほしいなって思いますけど、master 側から見た時の demoB は一歩進んだだけだったので、そこに追いついただけという形になるんですね。これを fast-forward という呼び方になります。まずこれは覚えといてください。で、これは「無事に demoB と master は同じ場所に進んだ」という事になります。
fast-forward ではないマージ
で、もう一個。今度は master とdemoA ブランチを合体させてみましょう。こちらは完全に、もう、枝分かれしてます。
master はここ(※手振りで真ん中)に元々いたんだけど、demoB ブランチと合体して、今ここ(※手振りで右側 / demoB側)にいるわけですよね。で、demoA ブランチっていうのは、元々の master から派生したここ(※手振りで左側 / demoA側)にいます。ここ(master)とここ(demoA)を合体させるには、こういう形(※手振りではΠのような形)にならないといけないので(笑)、その時には、絵柄的にも master と demoA が合体した新たなコミットが生まれます。ちょっとやってみましょう。
master に demoA をマージする
今、master なので、ここの上側にいますね。この上側にいます。ここから、同じ demoB をマージした時と同じように、demoA をマージさせたいと思います。
今 master で、マージをクリック。マージをクリックして demoA ブランチを選択します。で、それで OK を押すと。そうすると、はい、このように。
今は、(master は)元々ここ(demoB 側)にいました。このここですね。demoB と同じ所にいました。そして、demoA ブランチと合体させました。故に、この「Merge branch ‘demoA’」という形で、今、master に対して「demoA っていうのが追加されましたよ」っていうコミットが新たに生まれます。
整理すると…
元々のmaster がありました。そこから demoB ブランチを作りました。demoA ブランチを作りました。で、(masterを)demoB ブランチに対してマージした時は、ただ「こっち(demoB)に進んだだけだったのでコミットは生まれず、ここ(demoB)に進んだ」という fast-forward でした。
で、ここ(master)と離れた demoA を合体させる時には、この合体部分のコミットがいるので、その部分の所がこの「Merge branch ‘demoA’」 という自動コミットとして一個追加されている状態、という事になります。そして、この絵柄的にも、この合体した形の路線図になるということですね。
えーと、分かりにくいかもしれませんが、あの、このマージについて、これはシンプルな方なんです。実は、これはうまくいってるマージで、全く、この合体させる時に、ファイルに衝突がなかったのでシンプルに合体がされたという事になります。
そして、次にご紹介するのが初心者の方には難しいとされている「コンフリクト」というものになります。合体しようとしたけども「機械的にはそこで合体するのは判断ができない状態」というものがありますが、それは一旦、次回のレッスンに置いとくとして、まずはこのシンプルに「fast-forward で前に進むだけのマージ」と「別のブランチと本当に合体させた時の、コミットが発生するマージ」について、皆さんも作業なさってみてください。
付録 : Windowsでの表示
Windows10 / SourceTree ver.3.3.8
図1