ブランチ

ここではGitを使いこなす上で重要なブランチの解説を行います。

ブランチとは

ブランチは コミットの履歴を分岐して記録していくため の機能です。 履歴を分岐することによって複数人での作業時にスムーズに作業をすることが出来たり、 ブランチごとに異なった意味合いを持たせることが可能です。 例えば特定のブランチは必ず動作するコードを置いておき、 別のブランチではベータ版の不安定なコードを置いておくといった運用や、 何か大きな機能を実装する時にその実装に関するコミットをまとめておくのに使うことが出来ます。

Git上でのコミット履歴の表現

ブランチの解説の前にGitがコミットの履歴をどのように管理しているのかを見てみましょう。 Gitのコミットには以下のようなデータが含まれています。

  • そのコミットで何を変更したのか(変更点)1
  • コミットメッセージ
  • コミットした日時
  • 誰がコミットしたか(名前とメールアドレス)
  • 親となるコミットへの参照

ここで重要なのが親となるコミットへの参照です。 これによって一つ前のコミットを指し示す事によってコミットの履歴を追うことが出来ます。 もちろん、リポジトリを作成して最初のコミットには親は存在しないため親となるコミットへの参照はありませんし、 今後説明する マージコミット と呼ばれるコミットには親となるコミットへの参照が複数含まれています。 しかし、基本的には一つのコミットには親となるコミットへの参照が含まれていることを覚えておきましょう。

Gitのコミット履歴の表現

ブランチの仕組み

ブランチは特定のコミットを指す参照です。 git initでリポジトリを作成すると、masterと呼ばれるブランチがデフォルトで作成されます。2 masterという名前ですが特に何か特別なブランチというわけではありません。

Gitのコミット履歴の表現(ブランチ付き)

このブランチが指し示す参照先のコミットはコミットを繰り返していくと自動的に進んでいきます。

コミットを進めたときのブランチの動き

ブランチを新しく作る方法

ブランチ関連の操作をする場合はgit branchというコマンドを使います。 試しにtestというブランチを作ってみます。ブランチを作るにはgit branch <ブランチ名>です。

git branch test

現在リポジトリに存在するブランチを見るにはgit branchを実行してください。

ブランチ一覧

新しくブランチを作った場合は同じ位置を指し示す参照となります。

ブランチを新しく作ったときの様子

先程コミットを繰り返していくとブランチの参照は自動的に進んでいくと言いましたが、 今どのブランチで作業してるかが分からないと、進めるべきブランチがわかりません。

この今どのブランチで作業しているのかを指し示すための参照をHEADと呼びます。3

HEADの様子

HEADは必ず一つだけです。 また、ブランチを新しく作っただけではHEADが移動することはなく、 今はmasterブランチで作業している事がわかります。 HEADが指し示しているブランチを確認するには、git branchでブランチの一覧を表示させ、*がついているブランチ名を確認してください。

ブランチの移動

ブランチ間を移動するにはgit switchコマンドを使います。 git switch <ブランチ名>で指定したブランチへ移動することが出来ます。

git switch test

testブランチに移動したときのHEADの様子

なお存在しないブランチへ移動しようとするとエラーが起きますが、 git switch -c <ブランチ名>というように-cを足す事によってブランチの作成と移動を同時に行うことも可能です。

この状態で何か一つコミットをしてみましょう。 現在はHEADtestブランチを指し示している(testブランチで作業している)ため、 コミットをするとtestブランチの参照が一つ進みます。

testブランチでコミットを進めたときの様子

ccc.txtを追加したので、今作業ディレクトリにはccc.txtがありますし、git logでコミット履歴を見ると先程コミットした内容が表示されます。

testブランチでのディレクトリの様子とコミット履歴

ここでブランチをmasterに移動してみましょう。 git switchでブランチを移動し、作業ディレクトリとコミット履歴を見るとccc.txtもないですし、先程のコミットは表示されません。

masterブランチでのディレクトリの様子とコミット履歴

HEADmasterへ移動したため、ccc.txtを追加したコミットは見えなくなっています。 またブランチを移動したときに、作業ディレクトリの状態がそのブランチの最新のコミットに合わせられるため、ccc.txtは作業ディレクトリから消えています。 このコミットの内容から作業ディレクトリを復元することを チェックアウト(Checkout)する と言います。


1

正しくはステージする時に作られたスナップショットへの参照です。

2

最近のバージョンのGitを使用してる場合はこのデフォルトのブランチ名を設定で変更することが出来ます。詳しくは調べてみてください。

3

どのブランチも指し示していない、detached HEADと呼ばれる状態になる場合もあります。