git入門 ~仕組みを理解する~ 第3回 commitツリーを作成するための3つのエリア
前回、commitを作成するステップとして以下の3つの作業の説明を行いました。
- 作業場所でディレクトリやファイルを作成する
- ディレクトリやファイルに名前を付与して倉庫に保管し、梱包エリアで一覧表を作成する
- 梱包エリアで作成した一覧表に名前をつけてを倉庫に保管する
これまで、「作業場所」「梱包エリア」「倉庫」などの呼び方をしていましたが、実際のgitでの用語や中身を学んでいきましょう。
これまで登場したgit用語の整理
まずは、用語から確認していきましょう。
3つのエリア
これまで、あえて抽象的な表現で「作業場所」「梱包エリア」「倉庫」とエリア名をつけていましたが、gitでは各エリアの呼び方があります。
それぞれ、以下の図の通りです。
前回までの呼び方 | git用語 | - |
---|---|---|
作業場所 | working-directory | 作業ディレクトリ |
梱包エリア | staging-area(index) | ステージングエリア(インデックス) |
倉庫 | repository | リポジトリ |
※repositoryは=.gitディレクトリとも考えられるので、その場合はstaging-areaもrepositoryに含まれますが、ここでは、git-scmの呼び方に従って3つのエリア名を合わせるようにしました。
倉庫(repository)でのファイル、ディレクトリの呼び方
repository(リポジトリ)には3つ種類のオブジェクトが存在します。
ファイル、ディレクトリ、そしてcommitでしたね。
ファイルやディレクトリはrepository(リポジトリ)内ではblobやtreeと呼ばれています。
後ほど実際のコマンドで確認してみましょう。
一覧にまとめるとこうなります。
前回までの呼び方 | repositoryでのオブジェクト名 |
---|---|
ファイル | blob |
ディレクトリ | tree |
commit | commit |
倉庫(repository)内でのファイル、ディレクトリ、commitの名前
repository(リポジトリ)の3つのオブジェクト(ファイル、ディレクトリ、commit)には、repositoryで管理するために名前が付けられます。
その値はいずれも40文字のhash値です。
当サイトでは各hash値を以下の名前としています。
repositoryのオブジェクト | hash値の名前 |
---|---|
ファイル(blog) | blob-hash |
ディレクトリ(tree) | tree-hash |
commit | commit-hash |
3つのエリアの中身を確認しよう
repository(リポジトリ)には以下の3つのエリアがあることはこれまでで説明してきました。
では、実際に各エリアやオブジェクトがどのように配置されているのかを確認することでより理解を深めたいと思います。
working-directory(ワーキングディレクトリ)
working-directory(ワーキングディレクトリ)には主に2つの役割があります。
- ディレクトリとファイルを作成するエリア
- repositoryに登録されたcommitに記録されたtree(ディレクトリ)やblob(ファイル)を展開するエリア
実際の環境でいえば通常のディレクトリです。
ですので、ファイルの作成や編集、ディレクトリの作成なども通常の操作で行って問題ありません。
通常のディレクトリと唯一の違いは「.git」フォルダがあるという点です。
「.git」フォルダについて、staging-area(ステージングエリア)やrepository(リポジトリ)を格納するディレクトリですので次の章で説明します。
staging-area(ステージングエリア/インデックス)
commitに登録する対象となるファイル一覧をまとめるエリアです。
このファイル一覧をindex(インデックス)といいます。
staging-areaをindexと呼ばれる理由のもここからきています。
実際のindexファイルは.gitの配下にあります。
.git/index
repository(リポジトリ)
repository(倉庫)では3種類のオブジェクトを格納していましたね。
- ファイル(blob)
- ディレクトリ(tree)
- commit
これらのオブジェクトは以下のディレクトリで管理されています。
.git/objects
例えば、repositoryに4つのオブジェクトがある場合で確認してみましょう。
オブジェクトの種類 | 実際のファイル名など | hash値 |
---|---|---|
commit | - | 3999ca72a97ab47192619319487a34ccbe5d619b |
tree(ディレクトリ) | dir-A | 23d1c3ebdf3a74da9eb13d2fa72f0f7ef74c0e0d |
blob(ファイル) | file-A.txt | 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 |
blob(ファイル) | file-B.txt | f761ec192d9f0dca3329044b96ebdb12839dbff6 |
.git/objectsの配下を確認すると「23」「39」「72」「f7」というディレクトリがありますね。
これは、各オブジェクトの名前であるhash値の先頭の2文字になります。
具体的には「f7」オブジェクトは上の表でいうと「file-B.txt」のblobオブジェクトが格納されていることがわかります。
「f7」フォルダの中を確認すると「61ec192d9f0dca3329044b96ebdb12839dbff6」とうファイル名がありますね。
これは、「file-B.txt」のblobオブジェクトのhash値の3文字目以降です。
各オブジェクトのhash値 → フォルダ名 + ファイル名
ちなみに、中身のファイルは圧縮されていますので、そのままエディタでは見ることはできません。
まとめ
実際にgitを利用していて.gitフォルダの中身を確認することはあまりありませんが、gitがcommitオブジェクトなどをどのように扱っているのかを、一度は確認しておくことで次回以降で学ぶ「gitコマンド」で何をしているのかをイメージしやすく理解するスピードも速くなります。
次回はgitの環境を構築し、リポジトリを作成してみましょう。