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

PRODUCED BY RECRUIT

第2話 ブランチとは?ポインタってどういう意味?作成・確認・切り替え方法【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20190717120313j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

第1話 では、

$ git init (リポジトリを作る)
$ git status (状況を確認する)
$ git add (ステージする)
$ git commit (コミットする)
$ git log (履歴を見る)

を習得しました。

今回の第2話では、ブランチの概念の理解と、ブランチの作成・確認・切り替えを実践していきます。主人公のわかばちゃんと一緒に、楽しくGitコマンドを学んでいきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

ブランチとは?ブランチを活用しないとこんなことに

「ブランチとは並行世界である」と例えられることが多いですが、実際の活用場面がわからないとイメージできませんよね。そこで、ブランチを活用しないとき・活用したときの違いをマンガで見てみましょう。

たとえば「Webサービスに新機能を追加してほしい」と言われたとします。

そんなときにブランチを活用せず、本番環境に新機能を直接付けていくと、こんなことになってしまいます。
f:id:itstaffing:20190717120316j:plain

ブランチを活用するとこんなに便利!

では、ブランチを活用するとどうなるでしょうか?
f:id:itstaffing:20190717120319j:plain
「masterブランチ」というのは最初から存在するブランチです。$ git init でリポジトリを作ったときから存在しています。先ほどはmasterブランチひとつしか使っていませんでしたが、この例では「developブランチ」というものを新しく作りました。

複数のブランチを活用すると、本番環境に使われているソースコードに影響を与えず、安心して別のブランチで開発を進めることができます。開発用のブランチのコミットが更新されたら、テスト用URLの内容も自動で更新することも可能です。

新機能が安定し「もう本番に公開しても大丈夫だね」とわかってから、満を持して本番環境にマージ(統合)するというわけです。

「ブランチとはポインタである」ってどういう意味?

せっかくなので、ブランチについてもう一段深く理解してみましょう。

Gitの公式ドキュメント によると

ブランチとは(中略)コミットを指す軽量なポインタに過ぎません

と説明されています。

Gitにおけるポインタとは、具体的にどのようなものなのでしょうか?これを理解していると、今後Gitの概念をより理解しやすくなりますよ。
f:id:itstaffing:20190717120235j:plain

ブランチの正体を解き明かそう

f:id:itstaffing:20190617145538j:plain
え!?
リポジトリの中って入れるの!?
f:id:itstaffing:20190617145541j:plain
もちろん入れるとも。
「.git」という名前の、半透明のフォルダがリポジトリだ。
f:id:itstaffing:20190617145541j:plain
第1話 で作ったlessonファイルを開こう。
こんな状態になっているはずだ。
f:id:itstaffing:20190717120239j:plain
f:id:itstaffing:20190617145541j:plain
さっそくリポジトリの中身を見てみるぞ。
「.git」という名前の、半透明の隠しフォルダがあるな。
こいつがリポジトリだ。ダブルクリックして開いてくれたまえ。
(.gitフォルダが確認できない場合は、隠しファイルの表示設定をONにしましょう)
f:id:itstaffing:20190617145541j:plain
その中にある refs > heads の順にフォルダを開いていくと、masterというファイルがあるはずだ。
これがmasterブランチの正体だ。
さて、このファイルには何が書いてあるだろうか?
テキストエディタで開いてみたまえ。
f:id:itstaffing:20190717120242j:plain
f:id:itstaffing:20190717120247j:plain
f:id:itstaffing:20190617145538j:plain
masterっていうのは、最初からあるブランチの名前だよね!
開いてみると…
アレッ?たったこれだけ?
f:id:itstaffing:20190617145541j:plain
そう、ブランチの中身は驚くほどシンプルなんだ。
f:id:itstaffing:20190617145538j:plain
英数字の羅列が書いてあるけど…
02f11b759bfeb461e117c5da18bb2dcbe06d862a
これは何かの暗号?
f:id:itstaffing:20190617145541j:plain
HAHAHA、この文字列は「コミットID」だ。
「コミットハッシュ値」とも呼ばれているな。
f:id:itstaffing:20190617145535j:plain
そういえば前回、この長~い文字列、見た気がする!
コミットの履歴を見ようと $ git log を実行したときに、コミットメッセージと一緒に表示されてたわ。
f:id:itstaffing:20190617145541j:plain
いかにも。
コミットによって生成されたデータのことを「コミットオブジェクト」と呼ぶ。
Gitはひとつのコミットオブジェクトに対して、40文字のIDを割り当ててくれる。
これがコミットIDだ。
f:id:itstaffing:20190617145535j:plain
ほほう…!?なんだか面白くなってきたぞ。
で、つまりどういうこと?
f:id:itstaffing:20190617145541j:plain
つまり、ブランチは「ただ単に特定のコミットIDを指差しているだけ」なんだ。
f:id:itstaffing:20190717120250j:plain
f:id:itstaffing:20190617145535j:plain
ええ~っ!
拍子抜けするほどカンタンな話じゃん!
f:id:itstaffing:20190717120254j:plain

コミットオブジェクトの中身をのぞいてみよう

コミットが「コミットを指し示している」とはどういうことでしょうか?実際に見てみましょう。

同じ練習用フォルダの中で、もうひとつコミットを作り、コミットログには計2つのコミットがある状態にしてください。操作方法は次の通りです。

1. sample.txtに何かしら変更を加える
2. $ git add sample.txt
3. $ git commit -m “2回目のコミット”
4. $ git log

f:id:itstaffing:20190717120258j:plain

2回目のコミットが記録できましたね。コミット履歴がこのようになっていればOKです。

さて、このとき2回目のコミットオブジェクトには何が記録されているでしょうか?次のコマンドで見てみましょう。

$ git cat-file -p 0e9556

▼ 表示結果:これがコミットオブジェクトだ

treeee290b48b356d721ae54d1edb03993802cc98bad8
parentt02f11b759bfeb461e117c5da18bb2dcbe06d862a
authorrllminatolll<XXX@mail.com>l1562052826 +0900
committerrllminatolll<XXX@mail.com>l1562052826 +0900

「parent」の部分に注目です!02f11b…と書かれています。

f:id:itstaffing:20190617145535j:plain
あっ! このコミットIDは、ひとつ前のものだよね。
2つ目のコミットが、1つ目のコミットを指差してるってワケだ!
▼ 今の状態
f:id:itstaffing:20190717120300j:plain

コミットとコミットを結びつけているのは、このparent(親)の記載です。一番初めのコミットを除き、すべてのコミットオブジェクトには必ずparentが記載されています。

▼ 試しに、一番初めのコミット(イニシャルコミット)のコミットオブジェクトも見てみましょう。記載があるのはtree、author、committerの3つだけ。parentの記載がないのが見てとれます。

$ git cat-file -p 02f11b759

treee4576025551dd04fafbcb36bd7e1e7814018d11ea
authorrllminatolll<XXX@mail.com>11559898094 +0900
committerrllminatolll<XXX@mail.com>11559898094 +0900
 
★コミットIDは何を元に作られているの?

コミットID(コミットハッシュ値)は、実はこのコミットオブジェクトのバイト数と中身を使い、計算されて作られています。よって、コミットした人の名前やコミットした時間、指し示すparent、treeが違えばコミットハッシュ値も違うものになります。

その証拠に、同じ内容をコミットしていても、あなたの練習用リポジトリとわかばちゃんのコミットIDは違うはずです。コミットハッシュ値についてもっと深く知りたい方は、こちらの記事が詳しいのでおすすめです。

▼ Gitのコミットハッシュ値は何を元にどうやって生成されているのか

https://tech.mercari.com/entry/2016/02/08/173000

今存在するブランチを確認しよう

$ git branch

今、存在するブランチの一覧が表示されます。現段階では、masterブランチしかないので、* master と表示されると思います。

ブランチを作ろう

$ git branch [ブランチ名]

新しいブランチを作るコマンドです。$ git branch develop と打ち込みましょう。その後 $ git branch でブランチ一覧を見ると、このように表示されます。

  develop
* master

ちなみにこのアスタリスクマーク「*」は、簡単に言うと「あなたは今そのブランチの中にいますよ」という意味です。

▼ 今の状態
f:id:itstaffing:20190717120304j:plain

任意のブランチへ移動しよう

$ git checkout [ブランチ名]

さて、masterブランチからdevelopブランチに切り替えてみましょう。

$ git checkout develop と打ち込み、その後 $ git branch でブランチ一覧を見ると、今自分はdevelopブランチの中にいることが見てとれます。

▼ 今の状態
f:id:itstaffing:20190717120307j:plain

試しに、developブランチの中にいる状態で、sample.txtに何かしら文字を追加して新たにコミットを作ってみてください。

developブランチの指差しだけが動き、masterは2回目のコミットを指差したままです。こういう仕組みのおかげで、masterブランチに影響を与えることなく、開発用ブランチにコミットを積み重ねていくことができるのです。

▼ 今の状態
f:id:itstaffing:20190717120311j:plain
★知っていると便利! git checkout コマンドの豆知識

「-b」オプション

$ git checkout -b [ブランチ名]


ブランチの作成とチェックアウトを同時に行えます。


「-f」オプション

$ git checkout -f [ブランチ名]


ブランチを強制的に切り替えることができます。
(コミットしていない作業データは消えるので注意)

まとめ

さて、ここまでで、ブランチの概念の習得と合わせて

$ git branch(ブランチを作る)
$ git checkout (チェックアウトする)

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

Gitにはまだまだたくさんのコマンドがあります。
次回は、ブランチとブランチを併合する「マージ」について解説します!

▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」