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