도식화
1. 전체 구조 개요
.git/
├── HEAD ← 현재 가리키는 브랜치 (예: ref: refs/heads/main)
├── config ← 로컬 Git 설정
├── description ← 주로 bare repo에서 사용
├── index ← 스테이징 영역 정보 (트래킹 중인 파일 목록)
├── objects/ ← Git 객체 저장소 (blob, tree, commit, tag)
│ ├── xx/xxxx... ← SHA-1 해시로 저장된 개별 객체
│ └── pack/ ← 압축된 객체 저장소 (.pack, .idx)
├── refs/ ← 브랜치, 태그 등 참조(포인터)
│ ├── heads/ ← 브랜치 참조 (예: main, feature)
│ ├── remotes/ ← 원격 브랜치 정보 (예: origin/main)
│ └── tags/ ← 태그 정보
├── logs/ ← HEAD 및 refs의 이동 이력 (reflog 저장소)
│ ├── HEAD
│ └── refs/
├── info/ ← exclude 설정 등 부가 정보
└── hooks/ ← 커밋, 푸시 등 Git 이벤트용 스크립트
2. 각 구성 요소 설명
🔹 .git/HEAD
- 현재 Git이 바라보는 위치
- 대부분
ref: refs/heads/main
형태 - HEAD → 브랜치 → 커밋
🔹 .git/objects/
- Git의 핵심: 모든 파일/폴더/커밋을 SHA-1 해시값으로 저장
- 하위 폴더 + 해시 기반 객체들
.git/objects/
├── a7/...
├── d1/...
└── pack/ ← packfile 압축 저장소
🔹 .git/refs/
- 브랜치/태그가 어떤 커밋을 가리키는지 저장
.git/refs/heads/main → a1b2c3d4e5 (커밋 해시)
🔹 .git/logs/
git reflog
명령에서 쓰이는 내부 이력HEAD
,branches
,remotes
이동 내역 저장
🔹 .git/index
- 스테이징 영역(index)의 내부 상태를 저장하는 바이너리 파일
git add
→ index에 등록 →git commit
때 커밋됨
🔹 .git/hooks/
- 커밋/푸시/머지 전후에 실행되는 자동화 스크립트
pre-commit, post-commit, pre-push 등
3. 핵심 흐름
📁 Working Directory
↓ git add
📂 .git/index (Staging Area)
↓ git commit
📦 .git/objects/ (커밋, 트리, 블롭 저장)
↓ 브랜치 포인터 이동
📄 .git/refs/heads/main
↑ HEAD → 현재 브랜치 참조
요약
구성요소 | 설명 |
---|---|
| 현재 브랜치 또는 커밋을 가리킴 |
| 브랜치/태그 → 커밋 연결 |
| 모든 데이터(SHA-1 기반) 저장소 |
| 스테이징 상태 추적 |
| HEAD 및 브랜치 이동 이력 (reflog) |
| Git 이벤트 발생 시 실행되는 스크립트 |