エンジニア界隈にいて聞く日のない日はないと言っても過言ではない「Git」
そもそもGitとはなんぞや?
と周回遅れでもいいところですが、見ていきます。
この記事はgitの公式ドキュメントをベースに自分なりの補足を加えたものになります。
厳密な情報がほしい方は公式ドキュメントが優秀ですのでそちらをご覧下さい。
Gitが見ている世界
私たちが普段目にしている、ファイルやフォルダをGitではどのような仕組みで理解しているのでしょうか?
今回は、Gitが見ている世界、Gitオブジェクト(今回は2つのみ)について解説します。
Gitも私たちと同じように「ファイル」と「フォルダ」でデータを区別しているのですが、機械でも区別できるように工夫しなければなりません。
そこでgitでは「ブロブ:blob」と「ツリー:tree」という仕組みを用いています。
例として、下記のようなファイル構成の場合を見ていきます。
「test.txt」の中には「test content」と書かれています。
ブロブ:blob
ブロブは「ファイルの内容」と「ハッシュ値」の組み合わせで構成されるオブジェクトです。
$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
test content
「ハッシュ値」で問い合わせることで、「ファイルの内容」を参照することができます。
ツリー:tree
ツリーは「ファイル名」と「ハッシュ値」に加え、「タイプ」、「ファイルの種類」の組み合わせで構成されるオブジェクトです。
「タイプ」はそのオブジェクトがtreeなのか、blobなのか、などを表しています。「ファイルの種類」はそのオブジェクトが実行可能なファイルなのか、などを区別しています。
ここでキモなのは、ツリーオブジェクトの中にツリーオブジェクトを入れることができる。という点です。
この仕組みによって階層構造を実現しています。
100644 blob 08cf6101416f0ce0dda3c80e627f333854c4085c test.txt
040000 tree 5efb9bc29c482e023e40e0a2b3b7e49cec842034 file
このようなシンプルな仕組みでファイルを認識することが高速な動作に一役買っていそうです。