Skip to main content

Git 내부 구조 (Basic)


1. Git은 파일 버전이 아닌 스냅샷 시스템

Git은 "변경점(diff)"이 아니라, 전체 프로젝트의 스냅샷(상태)을 저장한다.

커밋 하나 = 전체 폴더의 압축 스냅샷 (단, 중복은 자동 제거됨)


2. Git의 3대 영역

작업 디렉토리      →    스테이징 영역       →    로컬 저장소
(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란?

HEAD → 현재 체크아웃한 브랜치 or 커밋
  • 보통은 HEAD → main
  • git checkout 하면 HEAD가 다른 커밋을 가리킴
  • git resetHEAD의 위치를 옮기는 것

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