派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【連載】マンガでわかるGit~コマンド編~ 第3話 マージの仕組みを見てみよう

f:id:itstaffing:20190828142031j:plain

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.目的としていた作業が終わり、変更を反映したいとき
f:id:itstaffing:20190828142034j:plain

2.masterブランチ上の新しいコミットを取り込みたいとき
f:id:itstaffing:20190828142038j:plain

実際にマージしてみよう

マージのコマンドは次の通りです。

$ git merge [統合したいブランチ名]


前回、developブランチにチェックアウトしている状態でsample.txtに変更を加え、コミットするところまで終えましたね。

▼ 今のブランチの状態
f:id:itstaffing:20190828142041j:plain

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

$ git checkout master
 
  develop
* master


masterにチェックアウトできました。

f:id:itstaffing:20190828142043j:plain

それではこの状態で、新しくsample2.txtを作り、ステージしてから、コミットします。

$ echo "Happy Git" > sample2.txt
$ git add sample2.txt
$ git commit -m “sample2.txtを作成”

これで、ブランチが二股に別れた状態になりました。

▼ 今のブランチの状態(わかりやすいように、コミットIDは省略しています)
f:id:itstaffing:20190828142047j:plain
いよいよマージしてみましょう。
マージするためのコマンドは、

$ git merge [統合したいブランチ名]

です。
今回は、developブランチからmasterブランチへ取り込みたいので、
masterブランチにチェックアウトしていることを確認し、

$ git merge develop

と打ち込みます。

コミットメッセージの編集画面になります。

「a」キーで入力モード、「esc」キーでコマンドモードになります。
特に追加するメッセージがなければ「esc」キーを押してから「ZZ」と入力してコミットメッセージを保存します。
f:id:itstaffing:20190828142049j:plain

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


▼ 今のブランチの状態
f:id:itstaffing:20190828142051j:plain

マージの仕組み

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

f:id:itstaffing:20190828142054j:plain

気がつきましたか?

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

f:id:itstaffing:20190617145535j:plain
えーっと、じゃあ普通のコミットは雌雄同体のアメーバで、マージコミットはお父さんとお母さんがいるって感じ?
f:id:itstaffing:20190617145541j:plain
不思議な比喩だな……。まぁ『マージコミットには2つ親がいるんだ~』ぐらいの認識でいいだろう。
f:id:itstaffing:20190617145535j:plain
親が3つになったり、4つになったりはしないの?たとえば3本のブランチを一気にまとめて統合したいときが、もしもあったらどうするの?
f:id:itstaffing:20190617145541j:plain
普段、3、4本のブランチを一気に統合するってことはあんまりないけど、マージの仕組み自体、統合できるブランチは2本までだから、1つずつ統合していくことになるよ。
f:id:itstaffing:20190617145535j:plain
ふーん!
f:id:itstaffing:20190617145541j:plain
今回はそのままマージできたけど、それぞれのブランチで同一行に変更があった場合、Gitが人間に「どっちの行の変更を採用すればいいの?」と尋ねてくることがあるんだ。これをコンフリクトという。コンフリクトについては次回取り上げよう。
f:id:itstaffing:20190617145535j:plain
Gitって親切なんだね!

まとめ

さて、ここまででマージの仕組みとコマンド操作がわかり、

$ git merge [ブランチ名]
(マージする)

が使えるようになりましたね!

Gitにはまだまだたくさんのコマンドがあります。
次回は、コンフリクトについて学んでいきましょう!

第1話はこちら
第2話はこちら
第4話はこちら