前回の続き的なのです。今回はブランチと少しだけ.gitディレクトリの中身に触れます。

ブランチとは


gitはコミットを行うとコミットオブジェクトを作成します。そのコミットオブジェクトに対してハッシュ値を振ったものがコミットハッシュです。

ブランチはこのコミットオブジェクトを参照しているにすぎません。実際に.gitディレクトリの中をみて確認してみます。まず、現在のブランチを確認します。

1
2
$ git branch
* master

ブランチの情報は./.git/refs/heads/ブランチ名にあります。今回の場合だと./.git/refs/heads/masterになります。

まずgit showで現在のmasterがどのコミットを指しているのか確認してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git show
commit 7254e787ac4fb79a0c5b25920da47b931dccc92e (HEAD -> master)
Author: YoshinoriN <yoshinorin@example.com>
Date: Thu Nov 1 22:12:40 2018 +0900

Write hoge

diff --git a/example.md b/example.md
index 180cf83..2262de0 100644
--- a/example.md
+++ b/example.md
@@ -1 +1 @@
-test2
+hoge

現在のmasterブランチは7254e787ac4fb79a0c5b25920da47b931dccc92eのコミットを指していることがわかります。次に./.git/refs/heads/masterの中身を確認してみます。

1
2
$ cat ./.git/refs/heads/master
7254e787ac4fb79a0c5b25920da47b931dccc92e

git showで確認したコミットハッシュと同じハッシュが表示されると思います。このような形でブランチはコミットオブジェクトを参照しているにすぎません。

ブランチがなくてもチェックアウトもマージもできる


上記のようにブランチはコミットオブジェクトを参照しているにすぎません。従ってわざわざブランチを作成しなくてもコミットハッシュを指定してチェックアウトが可能です。

まず、現在のgitログを確認してみましょう。

1
2
3
$ git log --oneline
7254e78 (HEAD -> master) Write hoge
685276c Initial commit

今は7254e78ですので685276cでチェックアウトしてみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
git checkout 685276c
Note: checking out '685276c'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b <new-branch-name>

HEAD is now at 685276c Initial commit

いろいろメッセージがでますが、最後のメッセージで685276cでチェックアウトされたことがわかります。git logでも確認できます。

1
2
$ git log --oneline
685276c (HEAD) Initial commit

また、実際にあまり行うことはないとは思いますが、マージもコミットハッシュを指定して行うことが可能です。

HEADとは


現在作業しているワーキングツリーのコミットを指します。これも前述のgit logの結果でわかる通り、ブランチではなくコミットを指します。

masterブランチについて


masterブランチはデフォルトで出来るブランチというだけであって、慣習的に使用されていますが、特に意味を持つブランチではありません。中身は他のブランチと何も変わりません。

つづく


つづく予定です。