まるノート

備忘録も兼ねて、様々なお役立ち情報をまとめています。

【Git】.git の仕組みや変化を調べてみた ①(git init から git add まで実行)

はじめに

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オブジェクトに対するアクセス権限を表しています。

補足 先頭の100は通常のファイル。
644は rw-r--r--(自分は書込み編集可能、グループメンバーや他人は閲覧のみ)を表しています。

blobオブジェクトの後ろの数字「0」はマージコンフリクトなどが起こると変わるようです。


以上で、とりあえずgit init からgit add コマンドによってどんなことが起こるか、
具体的にファイルの変化を見ることで理解を深めることが出来ました。

今回の記事ではここまでにして、次回 git commit による .git の変化を見てみようと思います。