はじめに
現在、DMM WEBCAMPでプログラミングを学習中の初心者です。
チーム開発のフェーズに入ったことで、GitHubを使用する機会が大幅に増えています。
最初は慣れなかった操作も、段々と回数を重ねていくうちに慣れてきました。
しかし、直感で操作してしまっているケースもあり、今のうちにしっかり勉強しようと思い、この記事を書くことにしました。
それでは参りましょう。
そもそも一般的なブランチの意味って?
英和辞典で調べてみると、branchの意味としては、
(木の)枝、枝状のもの、支流、(山の)支脈、支系、分家、部門、分科
となっていました。
チーム開発の現場に置き換えると、担当するセクションやパートごとに、ブランチを切った上で作業に取り掛かっていたので、枝や支流という和訳はしっくりきますね。
GitHubにおけるブランチの意味とは
念のために、Gitの公式ドキュメントでも確認してみましょうか。
公式情報によると、ブランチの定義はこうなっていました。
Git におけるブランチとは、コミットを指す軽量なポインタに過ぎません。
ん? ポインタ?
英語のbranchの和訳と、公式情報の定義がコンフリクトしてるみたいに思えてきました笑
もう少し詳しくみてみましょうか。
新しいブランチを作成する
新しい作業に取り組む時や、バグを解決する際など、ブランチを新しく作成する場面は往々にあると思います。
半ば無意識で行っている作業の意味を考えてみましょう。
再度、公式ドキュメントに立ち返りましょう。
ブランチを新しく作成するということは、
単に新たな移動先を指す新しいポインタが作られるだけ
とのこと。
今までずっと、新たな作業用の道が作られるようなイメージでしたが、ここでもあくまでポインタという概念で説明されています。
それならコミットの定義も確認しよう
「急がば回れ」ということわざに倣い、コミットの定義をみてみましょう。
Git にコミットすると、Git はコミットオブジェクトを作成して格納します。 このオブジェクトには、あなたがステージしたスナップショットへのポインタや作者・メッセージのメタデータ、そしてそのコミットの直接の親となるコミットへのポインタが含まれています。
なるほど、分からん。みたいな状態になりますね。
上の文章を読み解くと、コミットとは、git add後のステージングエリア上ファイルの、スナップショットを撮影すること、というイメージになるのでしょう。
以下、公式ドキュメントから画像等をお借りして、もう少し説明していきます。
早速、新しくtestingブランチを作成しましょう。
git branch -b testing

先ほどの公式ドキュメントの説明を思い出しましょう。
新しくブランチを作成したということは、単に新たな移動先を指す新しいポインタが作られただけです。
HEADとは?
もう一度上の図を確認すると、masterブランチの上に、HEADという文字が見えます。
HEADとは、あなたが作業しているローカルブランチへのポインタを指しています。
つまり、今現在、まだローカル環境はmasterブランチであり、先ほどのgit branch -bコマンドは新しくブランチを作成しただけで、ブランチ自体の切り替えはまだ行われていないということです。
ブランチの切り替え
それでは、ここで先ほど作成したtestingブランチに移動しましょう。
コマンドは、
git checkout testing
です。

ローカルブランチが切り替わったことで、HEADも移動していることが分かるでしょうか?
testingブランチにて、何かファイル変更を行い、コミットをしてみましょう。
git commit -m "changed something"
すると、以下のように変更します。

testingブランチは一つ分進んでいますが、masterブランチは一切動いていません。
HEADはコミットが進んだ分に併せて、一つ分移動していますね。
ここで、masterブランチに戻ってみましょう。

もうお分かりですね。
HEADもmasterブランチに移動していることが確認できました。
つまり、HEADはあくまで作業しているローカルブランチのポインタを示しているだけ、という説明通り、ローカルの場所を移動すれば、HEADがそれに付随される、ということですね。
おわりに
今まで、ブランチは線でつながっているイメージが強かったのですが、実際はポインタのような点が連続しているようなもの、という理解になろうかと思います。
GitHubも深掘りすれば、色々と学ぶべきことがたくさんありそうですね。