# Git 내부 구조 (Basic) --- ## 1. Git은 파일 버전이 아닌 ****스냅샷 시스템**** Git은 "변경점(diff)"이 아니라, ****전체 프로젝트의 스냅샷(상태)을 저장****한다. > 커밋 하나 = 전체 폴더의 압축 스냅샷 (단, 중복은 자동 제거됨) --- ## 2. Git의 3대 영역 ```text 작업 디렉토리 → 스테이징 영역 → 로컬 저장소 (Working Directory) (Staging/Index) (Repository/.git) 코드 작성 git add git commit ```
영역 설명
작업 디렉토리 실제로 코드 작성/수정하는 공간
스테이징 영역 (Index) 커밋할 파일을 담아두는 임시 공간 (`git add`)
로컬 저장소 커밋이 저장되는 `.git` 디렉토리
--- ## 3. 주요 Git 내부 객체 Git은 4가지 핵심 객체로 이루어져 있습니다:
객체 설명 예시
🔹 Blob 파일 내용 저장 (binary large object) `hello.java` 내용
🔸 Tree 디렉토리 구조와 파일 리스트 폴더 구조
🔹 Commit 커밋 메타데이터 + 부모 커밋 + tree "커밋 메시지"
🔸 Tag 특정 커밋에 이름 부여 v1.0.0
📦 커밋은 tree를 가리키고, tree는 blob들을 가리킵니다. ``` [commit] | v [tree] ├── [blob] hello.txt └── [blob] app.js ``` --- ## 4. HEAD란? ```bash HEAD → 현재 체크아웃한 브랜치 or 커밋 ``` - 보통은 `HEAD → main` - `git checkout` 하면 HEAD가 다른 커밋을 가리킴 - `git reset`****HEAD의 위치를 옮기는 것**** --- ## 5. 브랜치란? 브랜치는 단지 ****커밋을 가리키는 포인터****이다. ``` A---B---C ← main (브랜치) ↑ HEAD ``` - 브랜치를 옮긴다 → 포인터 이동 - 커밋한다 → 현재 브랜치가 가리키는 곳에서 새로운 커밋 추가 --- ## 6. Reflog란? ```bash git reflog ``` → HEAD와 브랜치가 가리키던 ****이전 위치들의 로그**** - `reset`이나 `checkout` 후에도 추적 가능 - 내부적으로 Git은 HEAD의 이동을 계속 추적함 --- ## 7. .git 디렉토리 구조 요약 ``` .git/ ├── objects/ ← 커밋, 트리, 블롭, 태그 객체 저장소 ├── refs/ ← 브랜치, 태그 등의 포인터 ├── HEAD ← 현재 가리키는 브랜치 ├── index ← 스테이징 정보 ├── logs/ ← reflog 정보 저장 └── config ← Git 설정 ``` --- ## 📌 정리
개념 설명
Commit 전체 스냅샷 + 부모 커밋 정보
Blob 파일 내용 저장
Tree 폴더 구조
Branch 커밋을 가리키는 포인터
HEAD 현재 브랜치 or 커밋
Staging Area 다음 커밋을 준비하는 공간
Reflog HEAD의 이동 이력 추적 가능 (복구에 유용)
---