# 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의 이동 이력 추적 가능 (복구에 유용)
|
---