git 내부 구조
기본 오브젝트
⸰blob
- 타입 : blob 타입
- 사이즈 : 컨텐츠의 용량을 bytes로 표시
- 컨텐츠 : 다양한 형식의 파일 저장(텍스트, 이미지, 음악, 이진 파일)
: 파일 이름, 파일 형식은 저장되지 않고, 파일의 메타정보를 제외한 파일의 내용 전체를 저장
: 각 파일의 내용은 고유한 Blob 오브젝트로 저장
: 각각의 고유한 SHA-1 해시를 가지고 있음
⸰tree
- 타입 : tree 타입
- 사이즈 : 트리 오브젝트의 용량을 bytes로 표시
- tree 객체 : 하위 디렉토리의 트리 객체를 재귀적으로 참조
- blob 객체 : 한 디렉토리에 있는 모든 blob을 담음
: 객체에 대한 접근 권한, 파일 이름 관리
: 디렉토리 내 파일들을 blob 오브젝트로, 그리고 하위 디렉토리들을 다른 tree 오브젝트로 참조하여 디렉토리의 구조를 표현
⸰commit
- 작성자
- 커밋 실행자
- 커밋 날짜
- 로그 메시지
- tree 객체 : 해당 커밋에서의 dir / file 상태
: 프로젝트의 특정 시점을 나타냄
: 디렉토리와 파일 내용은 tree 오브젝트를 통해 참조
⸰tag
- 객체 종류
- 태그 이름
- tagger
- 태그 메시지
- PGP 서명 정보
: 보통 릴리즈 버전을 표시할 때 사용
: 특정 commit 오브젝트를 참조하여 해당 버전의 프로젝트 상태를 쉽게 찾을 수 있음
동작 절차
⸰ Git Repository 파일이 변경되면, 상태를 기억하는 새 blob 객체를 생성
⸰ 파일이 스테이징 영역에 추가(git add)되면, Git은 디렉토리의 현재 상태를 나타내는 새 tree 객체를 생성
⸰ 변경 사항이 커밋되면 Git 은 새 commit 객체를 생성, 생성된 commit 객체는 이전 단계에서 만든 tree 오브젝트를 가리킴
⸰ 태그는 나중에 쉽게 참조할 수 있도록 특정 커밋을 표시하기 위해 언제든지 만들 수 있음, 태그가 생성되면 Git은 새 태그 객체를 생성
⸰ 모든 객체는 모두 Git Repository의 .git/objects 디렉토리에 저장, 태그는 오브젝트의 콘텐츠를 기반으로 하는 고유 식별자인 SHA-1 해시로 식별됨