Skip to main content

도식화


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 → 현재 브랜치 참조

요약

구성요소

설명

HEAD

현재 브랜치 또는 커밋을 가리킴

refs

브랜치/태그 → 커밋 연결

objects

모든 데이터(SHA-1 기반) 저장소

index

스테이징 상태 추적

logs

HEAD 및 브랜치 이동 이력 (reflog)

hooks

Git 이벤트 발생 시 실행되는 스크립트