入門Gitメモ chapter1-2
版管理の目的と機能
- 以前の状態に戻れる
- 変更履歴を調べる
- ディレクトリ構造全体を1つの単位として記録する
- 「なぜ」と「誰が」を記録する
何を版管理するか
gitではファイル毎のメタデータとしては実行可能ビットだけを記録するようにしている
gitの基本概念
オブジェクトの種類
- blob
- ファイルを扱う
- tree
- ディレクトリを扱う
- commit
- コミットを扱う
オブジェクトの名前と格納方法
- オブジェクトのヘッダ情報と内容をSHA-1ハッシュでハッシュ化した160ビットの値が名前(コミット名)になる
- オブジェクトのヘッダ情報と内容をzlibで圧縮して、オブジェクトのデータベースに格納する
ヘッダ
ヘッダ情報の内容は、オブジェクトの種類とデータ長。例えばblobオブジェクトの場合は、"blob 538"のようになる。
blobオブジェクトの内容
単純にファイルの内容
treeオブジェクトの内容
ディレクトリ内に存在するファイルの型、パス、オブジェクト名を列挙したものを内容としている。
型 | 解説 |
100644 | 通常のファイル |
100755 | 通常の実行可能ファイル |
120000 | シンボリックリンク |
40000 | ディレクトリ |
16000 | サブモジュール |
commitオブジェクトの内容
- 関連する treeオブジェクトの名前
- 親コミットの名前
- author(コミット内容を作成した人)の名前とメアド
- committer(実際にコミットした人)の名前とメアド
チェックアウト
リポジトリに記録されている内容をワークツリーに展開・反映する行為をチェックアウトすると言う。
マージ
- マージしたいブランチの共通の祖先を見つける
- それぞれのブランチの変更内容を調べる
- 片方だけ変更したものと、両方同じように変更したものは変更、それ以外で両方変更したものはconflictとする。
マージには、共通祖先となるコミットと、それぞれのブランチのHEADの3つの内容だけを使う。なので3-way mergeと呼ばれる。
.gitディレクトリ
- オブジェクト
- .git/objects/ ディレクトリ配下
- 各ブランチの先頭コミットオブジェクト名
- .git/refs/heads/ 配下
- タグのオブジェクト名
- .git/refs/tags/ 配下
- 現在チェックアウトされてるブランチのリファレンス
- .git/HEAD ファイル
- 現在のインデックス
- .git/index