
Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。
第2話 では、ブランチの概念の理解と、ブランチの作成・確認・切り替えを習得しました。
$ git checkout
$ git branch
今回の第3話では、2つのブランチを1つに統合する「マージ」を実践。その仕組みもあわせて学びましょう!

【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。・Amazon著者ページ
・Twitterアカウント
マージするタイミング
どのようなタイミングでマージをすることが多いのでしょうか。主なケースを2つ、マンガで見てみましょう。
1.目的としていた作業が終わり、変更を反映したいとき

2.masterブランチ上の新しいコミットを取り込みたいとき

実際にマージしてみよう
マージのコマンドは次の通りです。
$ git merge [統合したいブランチ名]
前回、developブランチにチェックアウトしている状態でsample.txtに変更を加え、コミットするところまで終えましたね。
▼ 今のブランチの状態

今からmasterにもコミットを作りたいので、この状態からmasterブランチにチェックアウトをします。
$ git checkout master
develop
* master
* master
masterにチェックアウトできました。

それではこの状態で、新しくsample2.txtを作り、ステージしてから、コミットします。
$ echo "Happy Git" > sample2.txt
$ git add sample2.txt
$ git commit -m “sample2.txtを作成”
$ git add sample2.txt
$ git commit -m “sample2.txtを作成”
これで、ブランチが二股に別れた状態になりました。
▼ 今のブランチの状態(わかりやすいように、コミットIDは省略しています)

いよいよマージしてみましょう。
マージするためのコマンドは、
マージするためのコマンドは、
$ git merge [統合したいブランチ名]
です。
今回は、developブランチからmasterブランチへ取り込みたいので、
masterブランチにチェックアウトしていることを確認し、
masterブランチにチェックアウトしていることを確認し、
$ git merge develop
と打ち込みます。
コミットメッセージの編集画面になります。
「a」キーで入力モード、「esc」キーでコマンドモードになります。
特に追加するメッセージがなければ「esc」キーを押してから「ZZ」と入力してコミットメッセージを保存します。
特に追加するメッセージがなければ「esc」キーを押してから「ZZ」と入力してコミットメッセージを保存します。

するとどうでしょう。
見事、2つのブランチが1つに統合されました!
▼ 今のブランチの状態

マージの仕組み
第2話 でブランチの仕組みを学んだからには「マージの仕組みも知りたい!」と思っている方のために、マージのコミットオブジェクトものぞいてみましょう。
$ git cat-file -p [マージコミットのID]

気がつきましたか?
通常は1つのコミットにつきparent(親)は1つですが、マージコミットの場合、驚くべきことにparentが2つあるのです。なぜなら、2つのコミットから1つのコミットを生成しているからです。お父さんとお母さんから子どもが生まれるようなイメージでしょうか。

えーっと、じゃあ普通のコミットは雌雄同体のアメーバで、マージコミットはお父さんとお母さんがいるって感じ?

不思議な比喩だな……。まぁ『マージコミットには2つ親がいるんだ~』ぐらいの認識でいいだろう。

親が3つになったり、4つになったりはしないの?たとえば3本のブランチを一気にまとめて統合したいときが、もしもあったらどうするの?

普段、3、4本のブランチを一気に統合するってことはあんまりないけど、マージの仕組み自体、統合できるブランチは2本までだから、1つずつ統合していくことになるよ。

ふーん!

今回はそのままマージできたけど、それぞれのブランチで同一行に変更があった場合、Gitが人間に「どっちの行の変更を採用すればいいの?」と尋ねてくることがあるんだ。これをコンフリクトという。コンフリクトについては次回取り上げよう。

Gitって親切なんだね!
まとめ
さて、ここまででマージの仕組みとコマンド操作がわかり、
$ git merge [ブランチ名]
が使えるようになりましたね!
Gitにはまだまだたくさんのコマンドがあります。
次回は、コンフリクトについて学んでいきましょう!
▼登場キャラクター紹介


▼わかばちゃんが登場する書籍
▼ これまでの「マンガでわかるGit」
第1話「リポジトリの作成」
第2話「ブランチの概念」
第3話「マージの仕組み」
第4話「コンフリクトの修正」
第5話「git revert」
第6話「git reset 3種類」
第7話「git reflog」
第8話「git switchとgit restore」
第9話「git diff」
第10話「git cherry-pick」
第11話「git stash」
第12話「git grep」
第13話「git blame」
第14話「git remote」
第15話「.gitconfig でコマンドを短縮」
第16話「.gitconfig と .git/config で複数のGitアカウントを使い分ける」
第17話「prune オプション」
第18話「git tag」
第19話「detached HEAD 状態って何?」
第2話「ブランチの概念」
第3話「マージの仕組み」
第4話「コンフリクトの修正」
第5話「git revert」
第6話「git reset 3種類」
第7話「git reflog」
第8話「git switchとgit restore」
第9話「git diff」
第10話「git cherry-pick」
第11話「git stash」
第12話「git grep」
第13話「git blame」
第14話「git remote」
第15話「.gitconfig でコマンドを短縮」
第16話「.gitconfig と .git/config で複数のGitアカウントを使い分ける」
第17話「prune オプション」
第18話「git tag」
第19話「detached HEAD 状態って何?」