
Git은 Content-addressable 파일 시스템입니다. 이는 Git의 핵심이 단순한 Key-Value 데이터 저장소로, 어떤 형식의 데이터라도 저장하고 그 데이터를 유일한 키로 식별할 수 있다는 것을 의미합니다. 이 키는 데이터에 접근할 수 있는 해시 값입니다.

Git 개체는 Blob, Tree, Commit, Tag 네 가지 주요 유형으로 나뉩니다.
Blob (Binary Large Object)
Tree
Commit
Tag

Git 명령어는 Git 개체와 상호 작용하여 파일의 버전을 관리하고 저장소를 조작합니다. 몇 가지 주요 명령어와 그 내부 동작 원리를 살펴보겠습니다.

git init
.git 디렉토리를 생성하고 초기 구조를 설정합니다.git add
git commit
git log
git status
Git은 SHA-1 해시를 사용하여 모든 데이터의 무결성을 보장합니다. 각 개체(Blob, Tree, Commit, Tag)는 SHA-1 해시로 식별되며, 데이터가 변경되면 해시도 변경됩니다. 이를 통해 Git은 데이터 손상이나 변조를 방지하고, 데이터의 일관성을 유지할 수 있습니다.
Git의 작동 원리는 데이터의 스냅샷을 지속적으로 저장하고 추적하는 것입니다. 각 커밋은 파일 시스템의 전체 스냅샷을 저장하지만, 효율성을 위해 실제로는 변경된 부분만 저장합니다. 이를 통해 Git은 매우 빠르고 효율적으로 동작할 수 있습니다.

$ git init test
$ cd test
$ echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4
git hash-object 명령은 데이터를 저장하고 접근할 수 있는 키(SHA-1 해시)를 반환합니다.Tree 개체는 여러 Blob 개체나 다른 Tree 개체를 참조합니다. 디렉토리 구조와 파일 이름을 저장합니다.
$ echo 'version 1' > test.txt
$ git update-index --add --cacheinfo 100644 83baae61804e65cc73a7201a7252750c76066a30 test.txt
$ git write-tree
d8329fc1cc938780ffdd9f94e0d364e0ea74f579
git update-index 명령은 파일을 인위적으로 스테이징 영역에 추가합니다.git write-tree 명령은 스테이징 영역의 상태를 Tree 개체로 저장합니다.Commit 개체는 특정 시점의 Tree 개체를 가리키고, 변경 사항의 메타데이터를 저장합니다.
$ echo 'first commit' | git commit-tree d8329f
fdf4fc3344e67ab068f836878b6c4951e3b15f3d
git commit-tree 명령은 커밋 메시지와 Tree 개체를 받아 새로운 커밋 개체를 생성합니다.