Git Objects
Git의 Object들에 대해
Git
- Git은 모든 데이터를 객체 데이터베이스에 저장
- 핵심 요소: Blob, Tree, Commit, Tag 네 가지 객체
.git/objects/디렉토리 안에 저장되며, 서로 유기적으로 연결되어 버전 관리 시스템을 구성한다.
Blob
- 역할: 파일의 내용 자체를 저장한다.
- 파일 이름이나 경로 같은 메타데이터는 포함하지 않고, 오직 데이터만 담는다.
- 내용이 같으면 동일한 Blob 객체를 공유하여 공간을 절약
파일 이름이 아니라 내용 자체를 기준으로 SHA-1 해시값을 계산해 Blob 객체를 생성한다.
Tree
- 역할: 디렉토리 구조(폴더)를 저장한다.
- 특정 디렉토리 안에 어떤 파일(Blob)과 하위 디렉토리(Tree)가 있는지 목록을 관리
- 파일 권한, 이름, 그리고 해당 Blob/Tree 객체의 해시값을 포함
계층적인 구조 덕분에 프로젝트 전체의 폴더 구조를 표현할 수 있다.
디렉토리 내의 파일이나 폴더 구조가 조금이라도 바뀌면, 내용이 변경된 것이므로 완전히 새로운 해시값을 가진 Tree 객체가 생성된다.
Commit
- 역할: 특정 시점의 스냅샷, 즉 하나의 버전을 기록
- 프로젝트 전체 상태를 나타내는 최상위 Tree 객체의 해시값을 가리킴
- 작성자, 커밋 메시지, 그리고 이전 커밋의 해시값을 포함해 이력을 만듦
Tag
- 역할: 특정 커밋에 붙이는 이름표
v1.0처럼 특정 버전을 쉽게 식별하고 참조하기 위해 사용
객체들이 함께 동작하는 방식
git add file.txt실행 시file.txt파일 내용으로 Blob 객체를 생성함- Git의 스테이징 영역(Index)에
file.txt라는 이름과 방금 생성된 Blob 객체의 해시값이 기록됨
git commit실행 시- 스테이징 영역의 상태를 바탕으로 디렉토리 구조를 나타내는 Tree 객체를 생성함
- 이 Tree 객체와 부모 커밋 정보, 메타데이터를 담은 Commit 객체가 생성됨
- 마지막으로, 현재 브랜치가 이 새로운 Commit 객체를 가리키도록 포인터가 업데이트됨