maeshimaの日記

メモ書きです

入門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(実際にコミットした人)の名前とメアド

チェックアウト

リポジトリに記録されている内容をワークツリーに展開・反映する行為をチェックアウトすると言う。

インデックス

SubversionCVSにはない、ワークツリーとリポジトリとの中間層。これによってファイルにした変更の一部だけをコミットすることができる。Subversionにない優位点!


マージ

  1. マージしたいブランチの共通の祖先を見つける
  2. それぞれのブランチの変更内容を調べる
  3. 片方だけ変更したものと、両方同じように変更したものは変更、それ以外で両方変更したものはconflictとする。

マージには、共通祖先となるコミットと、それぞれのブランチのHEADの3つの内容だけを使う。なので3-way mergeと呼ばれる。

.gitディレクトリ

オブジェクト
.git/objects/ ディレクトリ配下
各ブランチの先頭コミットオブジェクト名
.git/refs/heads/ 配下
タグのオブジェクト名
.git/refs/tags/ 配下
現在チェックアウトされてるブランチのリファレンス
.git/HEAD ファイル
現在のインデックス
.git/index

参考

入門Git
入門Git
posted with amazlet at 10.11.17
濱野 純(Junio C Hamano)
秀和システム
売り上げランキング: 104978