Git の基礎概念 2

参考書籍

入門 Git

Gitとは

git はファイルの状態を管理するためのソフトウェア。

git で管理されているディレクトリ配下のファイル群のバージョン管理を行うことができる。

オブジェクト

git はオブジェクトという単位でデータを扱う。オブジェクトには下記の型がある。

  • blob オブジェクト
  • tree オブジェクト
  • commit オブジェクト
  • tag オブジェクト

オブジェクトはオブジェクトデータベース に保管されている。一意の名前で検索するので高速にアクセスできる。

オブジェクトは全て下記のような構造を持っている。

  • 名前
  • ヘッダ
  • ボディ

名前はヘッダとボディをまとめてハッシュ化した文字列が与えられる。これによって一意性を担保している。

ヘッダにはオブジェクトの型種別とサイズが入っている。

ボディにはデータの内容が入っている。項目は型によって異なる。

blob オブジェクト

git で管理するファイル一つ分のデータに対応する。

blob オブジェクトのボディ

ファイルの中身が格納されている。

tree オブジェクト

git で管理するディレクトリ一つ分のデータに対応する。

tree オブジェクトのボディ

対応するディレクトリ直下のファイルやディレクトリのオブジェクト名のリストが格納される。

これによりトップレベルの tree オブジェクトから git 管理対象のファイル群の全てを再現することができる。

commit オブジェクト

コミット一つ分に対応する。

commit オブジェクトのボディ

コミットのメッセージや作成時間や作者が格納される。

これによっていつ誰がどういう意図でそのコミットが作られたのかを確認することができる。

その他 tree や parent という項目が記録されることでディレクトリ構成やプロジェクトの歴史を辿ることができる。

コミットオブジェクトの内容は下記のように確認できる。

git cat-file -p 6fe9eb78ab891c36a6d3b6b659e0d9f2a89545ee
tree

トップレベルの tree オブジェクトの名前。

これによりそのコミット の時点で git 管理するファイル群全てを再現することができる。

parent

一つ前のコミットのオブジェクト名。

これによりコミット間で親子関係を表現することができ、過去のコミットの歴史を辿ることができるようになる。

その他キーワード

ブランチ

ブランチとは特定のコミットへのポインタのこと。

ブランチ -> コミット

HEAD

HEAD とは現在チェックアウトしているブランチへのポインタのこと。

HEAD -> ブランチ -> コミット

マージ

マージするとマージコミット が作成される場合とそうでない場合がある。

マージする側が対象のブランチが分岐した時点から変化していない場合はマージコミットが作成されない。その場合はマージする側のブランチが対象のブランチのコミットと同じものになるだけ。これをfast forwardという。

マージコミットは parent を二つ持つ。