Gitの概念

Gitリポジトリは、

  • オブジェクト格納領域
  • インデックス

という2種類のデータ構造を保持します。
すべてのデータは、リポジトリ最上位の「.git」という隠しサブディレクトリの中に保存されます。そうです。

オブジェクト格納領域

元のデータファイル、全ログメッセージ、作成者情報、日付、その他もろもろが含まれる。
ここに置かれるオブジェクトは下記の4つだけ。

ブロブ

ファイルの各バージョンを表す。

ツリー

1階層分のディレクトリ情報を表す。
1つのディレクトリにある全ファイルの、ブロブのID、パス名と少しのメタデータを記録。(少しって何だ?)
再起的にほかの(サブ)ツリーオブジェクトを参照することもできる。

コミット

リポジトリに加えられた各変更のメタデータ(作者、コミッター、コミット日付、ログメッセージなど)を保持。
各コミットはあるツリーオブジェクトを指し示す。
このツリーオブジェクトは単一の完全なスナップショットとして、コミットが実行された時点におけるリポジトリの状態を記録している。

タグ

特定のオブジェクトに対し、(任意ではあるが、おそらく)人が読める名前を付ける。

インデックス

リポジトリ全体のディレクトリ構造が記述された、一時的かつ動的なバイナリファイル。
(ある瞬間のプロジェクト全体の構造を捉えている)

オブジェクトの名前

オブジェクトの内容にSHA1(シャーワン)を適用して得られたSHA1ハッシュ値から生成される、一意な名前を持っている。
Gitユーザは、SHA1、ハッシュコード、オブジェクトIDを、同じ意味で使うことがある。

Gitの動作概念

git init によって空のリポジトリを作成し、find でファイルをすべて表示する。

$ mkdir /tmp/hello
$ cd /tmp/hello/
$ git init
Initialized empty Git repository in /tmp/hello/.git/
$ find .
.
./.git
./.git/branches
./.git/description
./.git/refs
./.git/refs/tags
./.git/refs/heads
./.git/info
./.git/info/exclude
./.git/HEAD
./.git/objects
./.git/objects/pack
./.git/objects/info
./.git/config
./.git/hooks
./.git/hooks/prepare-commit-msg
./.git/hooks/pre-applypatch
./.git/hooks/update
./.git/hooks/applypatch-msg
./.git/hooks/pre-rebase
./.git/hooks/commit-msg
./.git/hooks/pre-commit
./.git/hooks/post-commit
./.git/hooks/post-receive
./.git/hooks/post-update

※通常は、.git の中のファイルを見たり触ったりする必要はありません。

ファイルを追加して確認
$ git add hello.txt
$ find .git/objects
.git/objects
.git/objects/3b
.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad
.git/objects/pack
.git/objects/info

Gitから無視するファイルの管理

.gitignore に追加する。

$ touch main.o
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       data
#       main.o
nothing added to commit but untracked files present (use "git add" to track)

main.o が未追跡ファイルで出てきた。

$ echo main.o > .gitignore
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
#       data
nothing added to commit but untracked files present (use "git add" to track)

main.o が消えたが、.gitignore が出てきた。git add するまでは出るらしい。