Gitとは
Gitがファイルのバージョン管理をするため、効率的に開発を進めることができる
変更記録はスナップショットとして保存される
スナップショットで変更を記録することにより、差分を計算する手順が省かれ、マージする際に計算をせず、ブランチをマージすることができる
よって、開発の効率があがる
変更記録を差分で確認する際は、計算をする必要がある
https://gihyo.jp/dev/column/01/prog/2011/diff_sd200906
利点
バージョンを記録することにより、以前の状態の戻すことができる
バージョンを記録する際に、コミットをするため、コミットを辿ることで、以前のバージョンに戻すことできる
git add
1.git add コマンド実行後にGitオブジェクトが作成される
Gitオブジェクトは.git/object配下のディレクトリに保存される
Gitオブジェクトとは、blobオブジェクト、treeオブジェクト、commitオブジェクトなどが当たる
blobオブジェクト
git addしたファイルの中身ヘッダーとファイルの内容を、SHA1というハッシュ関数で40文字の英数字に変換したオブジェクトのこと
ハッシュIDのうち、最初の2文字をサブディレクトリとして、残りの38文字をオブジェクト名として保存する
#blobオブジェクトを確認
$ find .git/objects -type f
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
#ステージングされたハッシュIDを表示します
$ git hash-object test/test
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
#.git以下のファイル構造を表示する
--snip--
tree .git
|-- objects
| |-- e6
| | `-- 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
--snip--
$ git ls-files --stage
100644 188f4affe876964499a95325588f71d4955c16ef 0 test
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 testgsdjfs
040000:ディレクトリ
100644:通常の実行不可能なファイル
100664:グループ書き込み可能な通常の実行不可能ファイル
100755:実行可能ファイル
120000:シンボリックリンク
160000:Gitのリンク
先頭の3文字は、ファイルやディレクトリそれ以外を指す
後半3文字は、権限を指す
競合がない場合は、0となる
git commit
2.treeオブジェクト
blobオブジェクト名は、ヘッダーとファイル内容をSHA1によって、ハッシュ化された名前となる
そのため、blobオブジェクトとgit addしたファイルを、treeオブジェクトが紐づける
※treeオブジェクトはファイル構造とは異なる
#ツリーファイルのIDを取得する
$ git cat-file -p HEAD
tree 850626a9d2a85698c118b332191586765aeb01f6
author user名 <xx@gmail.com> 1709757111 +0900
committer user名 <xx@gmail.com> 1709757111 +0900
test
#ツリーファイルの中身を表示する
$ git cat-file -p 850626
040000 tree f05af273ba36fe5176e5eaab349661a56b3d27a0 test
3.Commitオブジェクト
commit時にcommit オブジェクトが生成される
commit オブジェクトはいつ、だれが、何を、目的が記録される
#ツリーファイルのIDを取得する
$ git cat-file -p HEAD
tree 449ddfa86385848f2d570d485c2dfa376ff6408f
parent 7a519397572c9cb8e9bebb62182532ecaa00d429
author user名 <xx@gmail.com> 1709757111 +0900
committer user名 <xx@gmail.com> 1709757111 +0900
treeは、ツリーオブジェクトが保存されている
parentは、親コミットを保存している
committerは、コミットを実施した人を保存している
Authorは、ファイルを編集を実施した人を保存している
備考
gitの構造はシンプルで素敵ですね
https://qiita.com/hiroaki-u/items/1c474c569b674c24493b
https://stackoverflow.com/questions/737673/how-to-read-the-mode-field-of-git-ls-trees-output