ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

Gitの仕組みを勉強してみた

Gitについて詳しく知ろうと、勉強してみたことの備忘録です。

Gitの記録方法

Gitはデータをスナップショットとして記録しています。
差分保存だと、マージやブランチする際に結構な時間がかかってしまうようで。

Gitの概要

gitのローカルは下記3つのエリアに別れています。

  • ワークツリー
    ファイルを変更したりする手元の作業場所

  • ステージ
    コミットする変更を準備する場所
    記録したい変更分のみ、ステージに追加する。
    →git addコマンド

  • リポジトリ
    スナップショットを記録しておく場所
    ステージに追加されているものをスナップショットとして保存する
    →git commitコマンド

流れとしては、ワークツリーでファイルを変更してステージに追加。その後、リポジトリにスナップショットとして保存する、といった感じ。

Gitのデータについて

Gitはリポジトリに「圧縮ファイル」「ツリーファイル」「コミットファイル」の3種類のファイルを保持し、これでバージョン管理を行なっています。
下記でそれぞれのファイルについて概要を記しておきます。

  • 圧縮ファイル(git addで作成される)
    ファイルの中身そのものを圧縮したものです。正確には「blob(ブロブ)オブジェクト」と言います。blobというのは「カタマリ」という意味です。ファイルの中身を圧縮しただけのカタマリということになります。
    この圧縮ファイルのファイル名はハッシュIDです。ハッシュIDのうち、先頭2文字をディレクトリ名に、残り38文字をファイル名にして保存されます。このハッシュIDは、ファイルの中身に対して一意になるため、ファイルの変更前と変更後では異なるハッシュIDが付与されます。このファイルは.git配下のobjectsフォルダの中を覗くとあると思います。

  • ツリーファイル(git commitで作成される)
    圧縮ファイルは、ファイルの中身を圧縮したものを保存していて、圧縮ファイルのファイル名もファイルの中身をベースにハッシュ関数で作成されたものでした。つまり、圧縮ファイルにはもともとのファイル名の情報がどこにも残っていないことになります。
    そこで、ファイル名とファイルの中身の組み合わせ(ファイル構造)を保存するためにあるのがツリーファイルです。コミットをするとツリーファイルが作成されます。ツリーファイルは「treeオブジェクト」と言います。

  • コミットファイル(git commitで作成される)
    ツリーファイルが作成されたことで、ファイルの構造がわかるようになりました。しかしまだ、いつ、誰が、何を、何のために変更したのかということがわかりません。 そこで、その情報を保存するためにあるのがコミットファイルです。コミットファイルは正確には「commitオブジェクト」と言います。
    このcommitオブジェクトには、ツリーファイル、親コミット、作成者、メールアドレス、コミットメッセージなどが保存されています。親コミットを保存することで、過去のコミット情報を辿ることができる訳です。