【gitをソフト開発で使いこなそう:第4回】HEADって何だ?どこで使うんだ?
修正
2020/02/11:コラム「黒い矢印、逆じゃない?」を追加。
コミットはどのように保存されているか
今回は、ブランチについて解説していきます。 ですがその前にgitでコミットがどのように保存されているかを見ていくことにします。
以降のコミットの保持方法は分かりやすさを優先しているため、厳密には正しくない部分があります。
厳密な正しい格納方法を知りたい方は、参考文献にある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)が作成されます。コミットの中には上の図にもある通りコミットされた時点でのファイルの情報が格納されています。
各コミットには、ひとつ前のコミットの名前が保存されています。
これを使って前に行われたコミットをたどることが出来ます。
上の図を見るとリンクを表す黒い矢印は、右から左に書かれています。
時間の流れ的に言えば、矢印は左から右のほうがいい気がします。
矢印の向きが逆に見えるのは、黒い矢印がコミットからコミットへのリンク(つながり)を表しているからです。
ブランチって何だろう?
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ブランチが作成されていることが分かります。
続いてHEADがmasterブランチを指していることを確認した上で、適当にファイルを追加してコミットしてみましょう。(今回はadd.txtを追加しました)
git add --all git commit -m “add commit“
実行が完了したら再度次のコマンドを実行し、ブランチとコミットの関係が下の図のようになっていることを確認してください。
git log --oneline --graph
HEADを移動する(ブランチを切り替える)
本記事の最初の方にHEADのことを「現在いるブランチを指す特殊なポインタ」と解説しましたが、このHEADを別のブランチに移動させるとどうなるのでしょうか。
HEADを別のブランチに移動させるには、次のコマンドを実行します。
git checkout <移動するブランチ名>
HEADが指しているブランチは、以下のコマンドでも見ることが出来ます。HEADが指しているブランチ名の横にアスタリスクマークが着きます。
git branch
develop * master
今回は、developブランチへHEADを移動させるため以下のコマンドを実行します。
git checkout develop
実行した後gitで管理しているフォルダの中身を見てみると先ほど追加したファイル(add.txt)が消えていることが分かります。
HEADを別のブランチに移動させると、フォルダの中身がそのブランチが指しているコミットの内容に変わることを覚えておいてください。(HEADを移動したことによってファイル構成がAからBに変わりました。)
次回予告
次回は、今回解説したブランチを実際の開発でどのように使うか解説します。
この記事について
この記事について、誤字や間違っている所がある場合は私のTwitterか、コメント欄から連絡をお願いします。
参考文献
Pro Git
Git,GitHubの使い方について、非常に詳しく丁寧に解説されています。
ですが、内容が初心者には難しいと思われるため一度入門記事等を読んで一通りGit,Githubを勉強してから読まれると理解が深まると思います。
pdf形式であれば、日本語版が無料で公開されています。
git-scm.com