그리고 git이 자체적으로 파일관리하는 방법이 독특한데요. (그래서 git는 file system이라고 부르기도 합니다)
이것도 알아보면 꽤 재밌어요. 더 좋은 자료들도 있을거같은데 제가 찾은건 요거.
git은 내부적으로 commit, tree, blob, tag의 4가지 오브젝트 타입을 관리한다.
Blob 오브젝트는 파일의 내용을 담당하며, 각 파일의 내용은 고유한 Blob 오브젝트로 저장됩니다.
Blob은 Binary Large Object의 약자로, 각 Blob 오브젝트는 고유한 SHA-1 해시를 가지고 있습니다.
Tree 오브젝트는 디렉토리(폴더)를 나타내며, 디렉토리 내의 파일들을 Blob 오브젝트로, 그리고 하위 디렉토리들을 다른 Tree 오브젝트로 참조합니다. 따라서, Tree 오브젝트는 디렉토리의 구조를 표현하게 됩니다.

Commit 오브젝트는 프로젝트의 특정 시점을 나타내며, 작성자 정보, 커밋 메시지, 그리고 그 시점의 디렉토리 구조와 파일 내용을 참조합니다. 디렉토리 구조와 파일 내용은 Tree 오브젝트를 통해 참조하게 됩니다.
Tag 오브젝트는 보통 릴리즈 버전을 표시할 때 사용되며, 특정 Commit 오브젝트를 참조합니다. 이를 통해, 해당 버전의 프로젝트 상태를 쉽게 찾을 수 있게 됩니다.
Git은 데이터를 저장할 때 SHA-1 해시 값을 사용하여 파일과 디렉토리를 식별한다.
이 해시는 40자리의 문자열로 구성되며, Git 내부에서 효율적인 저장을 위해 이 해시를 기반으로 디렉토리를 나눈다
ex) Blob의 해시: d670460b4b4aece5915caf5c68d12f560a9fe3e4
해시의 첫 두 글자: 디렉토리 이름 .git/objects/d6/
나머지 38글자: 파일 이름 70460b4b4aece5915caf5c68d12f560a9fe3e4
해당 Blob 객체는 .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 경로에 저장된다
저장된 Blob은 Tree 객체에 참조되고, Tree는 Commit 객체에 연결된다
Git은 모든 객체(Blob, Tree, Commit 등)를 .git/objects/ 디렉토리에 저장한다.
여기서 데이터를 효율적으로 관리하기 위해 해시 값을 기준으로 디렉토리를 계층적으로 나눈다
즉, 디렉토리를 나눔으로써, Git은 특정 객체를 찾을 때 디렉토리와 파일을 빠르게 검색할 수 있다.
1) 해당 커밋의 SHA-1 해시를 찾는다
2) Commit 객체에서 현재 Tree 객체의 해시를 참조한다
3) Tree 객체에서 Blob 객체를 추적해 각 파일 내용을 복원한다
4) 파일 시스템에 복원된 파일 내용을 배치한다
파일 내용을 중복 없이 효율적으로 저장
복잡한 디렉토리 구조를 관리
변경 이력을 기록하며, 프로젝트의 현재 상태를 스냅샷으로 저장