git入門 ~仕組みを理解する~ 第3回 commitツリーを作成するための3つのエリア

2020年3月14日git-master

前回、commitを作成するステップとして以下の3つの作業の説明を行いました。

  1. 作業場所でディレクトリやファイルを作成する
  2. ディレクトリやファイルに名前を付与して倉庫に保管し、梱包エリアで一覧表を作成する
  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
commitcommit

倉庫(repository)内でのファイル、ディレクトリ、commitの名前

repository(リポジトリ)の3つのオブジェクト(ファイル、ディレクトリ、commit)には、repositoryで管理するために名前が付けられます。

その値はいずれも40文字のhash値です。

当サイトでは各hash値を以下の名前としています。

repositoryのオブジェクトhash値の名前
ファイル(blog)blob-hash
ディレクトリ(tree)tree-hash
commitcommit-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値
commit3999ca72a97ab47192619319487a34ccbe5d619b
tree(ディレクトリ)dir-A23d1c3ebdf3a74da9eb13d2fa72f0f7ef74c0e0d
blob(ファイル)file-A.txt72943a16fb2c8f38f9dde202b7a70ccc19c52f34
blob(ファイル)file-B.txtf761ec192d9f0dca3329044b96ebdb12839dbff6

.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の環境を構築し、リポジトリを作成してみましょう。

git-master

Posted by snow