【gitをソフト開発で使いこなそう:第4回】HEADって何だ?どこで使うんだ?

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

修正

2020/02/11:コラム「黒い矢印、逆じゃない?」を追加。

コミットはどのように保存されているか

今回は、ブランチについて解説していきます。 ですがその前にgitでコミットがどのように保存されているかを見ていくことにします。

Column:以降の説明について

以降のコミットの保持方法は分かりやすさを優先しているため、厳密には正しくない部分があります。
厳密な正しい格納方法を知りたい方は、参考文献にあるPro gitの「第10章Gitの内側」をご覧ください。

コミットの「名前」を見てみる

前回作成したリポジトリでGit Bashを開き次のコマンドを実行してください。

git log

すると次のように表示されるはずです。(usernameとmailAddressにはあなたが設定した値が入ります。)

commit 83b72c742842c720a090a11d7ca6430beb1952ca (HEAD -> master)
Author: username <mailAddress>
Date:   Thu Nov 14 22:05:21 2019 +0900

    test.cとtest.hを変更

commit 1fbbcb0643cbc3abfeda3756acd76c4a87557ecd
Author: username  <mailAddress>
Date:   Thu Nov 14 22:03:35 2019 +0900

    commit message

上の出力結果を見ると次のような文字列が何回も表示されているのが分かります。

83b72c742842c720a090a11d7ca6430beb1952ca

これは各コミットに割り当てられた名前を表します。 これを使って特定のコミットを指定することができます。

コミットはどのように保存されている?

コミットは下の図のように保存されています。

コミット保存方法の説明

コミットを行うとコミット(上の図でいうcommit)が作成されます。コミットの中には上の図にもある通りコミットされた時点でのファイルの情報が格納されています。
各コミットには、ひとつ前のコミットの名前が保存されています。
これを使って前に行われたコミットをたどることが出来ます。

Column:黒い矢印、逆じゃない?

上の図を見るとリンクを表す黒い矢印は、右から左に書かれています。
時間の流れ的に言えば、矢印は左から右のほうがいい気がします。
矢印の向きが逆に見えるのは、黒い矢印がコミットからコミットへのリンク(つながり)を表しているからです。

ブランチって何だろう?

Gitにおけるブランチとはコミットを指すもの(ポインタ)のことです。
下の図を見てみましょう。

ブランチとコミットの説明

図中では「master」と「develop」がブランチで、それぞれBとCのコミットを指しています。
masterブランチを指している「HEAD」は現在いるブランチを指す特殊なポインタです。

ブランチをコマンドで見てみる

前回作成したリポジトリで以下のコマンドを実行してください。

git log --oneline --graph

すると以下のような実行結果が得られます。(細かい箇所は違っていても構いません)

* 83b72c7 (HEAD -> master) test.cとtest.hを変更
* 1fbbcb0 commit message

fb1e81f...と書いてある行一つが一つのコミットを表します。同じ行に書かれているHEAD -> masterがHEADがmasterブランチを指していることを表しています。

現在のブランチとコミット

ブランチを新たに作成する

ブランチを新たに作成するには、以下のコマンドを実行します。

git branch <追加するブランチの名前>

ここでは、例として前回作成したリポジトリにdevelopブランチを作成してみましょう。
次のコマンドを実行します。

git branch develop

コマンドが実行されたら続いて次のコマンドを実行します。

git log --oneline --graph

新たにdevelopブランチが作成されていることが分かります。

developブランチ作成後

続いてHEADがmasterブランチを指していることを確認した上で、適当にファイルを追加してコミットしてみましょう。(今回はadd.txtを追加しました)

git add --all
git commit -m “add commit“

実行が完了したら再度次のコマンドを実行し、ブランチとコミットの関係が下の図のようになっていることを確認してください。

git log --oneline --graph

masterブランチコミット後

HEADを移動する(ブランチを切り替える)

本記事の最初の方にHEADのことを「現在いるブランチを指す特殊なポインタ」と解説しましたが、このHEADを別のブランチに移動させるとどうなるのでしょうか。
HEADを別のブランチに移動させるには、次のコマンドを実行します。

git checkout <移動するブランチ名>

HEADが指しているブランチは、以下のコマンドでも見ることが出来ます。HEADが指しているブランチ名の横にアスタリスクマークが着きます。

git branch
  develop
* master

今回は、developブランチへHEADを移動させるため以下のコマンドを実行します。

git checkout develop

実行した後gitで管理しているフォルダの中身を見てみると先ほど追加したファイル(add.txt)が消えていることが分かります。

HEADを別のブランチに移動させると、フォルダの中身がそのブランチが指しているコミットの内容に変わることを覚えておいてください。(HEADを移動したことによってファイル構成がAからBに変わりました。)

HEAD移動でフォルダ内容変化

次回予告

次回は、今回解説したブランチを実際の開発でどのように使うか解説します。

この記事について

この記事について、誤字や間違っている所がある場合は私のTwitterか、コメント欄から連絡をお願いします。

参考文献

Pro Git

Git,GitHubの使い方について、非常に詳しく丁寧に解説されています。
ですが、内容が初心者には難しいと思われるため一度入門記事等を読んで一通りGit,Githubを勉強してから読まれると理解が深まると思います。
pdf形式であれば、日本語版が無料で公開されています。 git-scm.com

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp