はじめに
Git の使い方を勉強中です。以前から利用はしていますが不明な点が多々あり、基本的なことから学習し直しています。
例えば、よく以下のようなコミットツリーやブランチの概念図を目にしますがいまいち理解ができていません。

一応、Github のようなリモートリポジトリを利用する場合、以下のような流れで追加したファイルや変更内容を登録するってことはある程度知ってはいるつもりです。
今回はより理解を進めるため、
ステージとかリポジトリといった概念の実態である「.git」内に生成されるファイルの内容を詳しく調べ、その内容を記事にしました。
※Gitはインストール済みの前提です。
git initを実行
とりあえず空の作業フォルダを用意します。
右クリックメニューの「Git bash Here」を開きgit init
を実行。
$ git init
すると作業フォルダに「.git」なる隠しフォルダが生成されます。
「.git」の中は以下のようナゾのファイル郡が見えるはず。
これらがgitのリポジトリやステージを構成するファイルになります。
以降、gitの操作を行うことで、これらのファイルがどうかわるか見てゆきます。
特に注目するのが「objects」フォルダ。初期状態では2つのフォルダが存在しています。
作業ディレクトリに作成したファイルを、 git add でステージに追加してみる
次に何か適当なテキストファイルを作業ディレクトリに作成し、そのままgit add
コマンドでステージに追加してみます。
$ echo 'Hello world' > test.txt $ git add test.txt
すると先程の「objects」フォルダ内にフォルダが追加されているはずです。
なかを見ると、、以下のようなファイルがあります。
これは先程git add
で追加した
「test.txt」の内容 + 必要な追加情報を付与して圧縮したファイルになります。
「test.txt」の内容というのは記述内容である「Hello world」になります。
ファイル名の情報はここにはありません。
ファイル名やファイルのパスといった情報は、
「objects」フォルダと同じ階層にある「index」ファイルに書き込まれています。
よく見ると「objects」フォルダと「index」ファイルのみ更新日時が変わっています。
git add によりこの2つのファイルが更新されたことになります。
blob オブジェクト
ここで、先程確認した「objects」フォルダに生成された内容を解説します。
利用するのはgit cat-file
というコマンドです。
-p
を付与した場合「objects」フォルダ内の情報をはじめとするリポジトリに登録されている情報を見ることができます。
$ git cat-file [オプション] [ハッシュ値]
「ハッシュ値」には、「objects」内のフォルダ名と中のファイル名を合わせた名称を指定します。
とりあえず実行してみます。
$ git cat-file -p 802992c4220de19a90767f3000a79a31b98d0df7 Hello world
「test.txt」の記述内容である「Hello World」が表示されました。
つまり「Hello world」をハッシュ化して出来た値は「objects」フォルダ配下に以下のように保存されるということです。
頭2桁:フォルダ名
残り38桁:ファイル名
これらは合わせてblobオブジェクトと呼ばれます。
38桁のファイル名の方には、ステージに追加したファイル内容が圧縮保存されています。
index
次に「index」ファイルの方を見てみます。
git ls-files --stage
というコマンドで「index」ファイルの情報を確認できます。
以下を実行すると、
$ git ls-files --stage 100644 802992c4220de19a90767f3000a79a31b98d0df7 0 test.txt
先ほどのblobオブジェクトとファイルのパスが記述されています。
先頭の「100644」 はblobオブジェクトに対するアクセス権限を表しています。
blobオブジェクトの後ろの数字「0」はマージコンフリクトなどが起こると変わるようです。
以上で、とりあえずgit init からgit add コマンドによってどんなことが起こるか、
具体的にファイルの変化を見ることで理解を深めることが出来ました。
今回の記事ではここまでにして、次回 git commit による .git の変化を見てみようと思います。