🔧

Git 내부 구조: 데이터는 어디에 저장될까?

Git이 파일 시스템에서 어떻게 데이터를 관리하는지 자세히 알아보세요

📁 파일 시스템 구조

프로젝트 디렉토리 구조

📁 my-project/
📄 README.md
📄 index.js
📄 style.css
📁 .git/
📄 index (Staging Area 데이터)
📄 HEAD (현재 브랜치 포인터)
📁 objects/ (Repository 데이터)
📁 ab/ (SHA-1 앞 2자리로 분류)
📄 cd1234... (blob/tree/commit 객체)
📁 refs/ (브랜치와 태그 참조)
📁 heads/ (브랜치들)
📄 main (메인 브랜치)
📄 config (Git 설정)

.git 폴더 상세 구조

📄 index (Staging Area)

바이너리 형태로 저장된 스테이징 정보

  • • 파일명과 메타데이터
  • • 파일 내용의 SHA-1 해시
  • • 수정 시간, 권한 등

📁 objects/ (Repository)

압축된 Git 객체들의 저장소

  • • blob: 파일 내용
  • • tree: 디렉토리 구조
  • • commit: 커밋 정보
  • • tag: 태그 정보

📄 HEAD

현재 체크아웃된 브랜치의 참조

ref: refs/heads/main

💾 영역별 데이터 저장 방식

Working Directory

저장 위치: 실제 파일 시스템

데이터 형태: 일반 파일들

특징: 직접 편집 가능, Git이 변경사항을 감지

Staging Area

저장 위치: .git/index 파일

데이터 형태: 바이너리 인덱스

특징: 다음 커밋의 스냅샷을 미리 준비

Repository

저장 위치: .git/objects/ 폴더

데이터 형태: 압축된 Git 객체

특징: 불변성, 중복 제거, 무결성 보장

🗂️ Git 객체의 종류와 역할

📄 Blob (Binary Large Object)

파일의 실제 내용을 저장하는 객체

blob 14
hello world

🌳 Tree

디렉토리 구조와 파일명을 저장하는 객체

tree 73
100644 blob a906cb... README.md
100644 blob 5716ca... index.js

📝 Commit

커밋 정보와 스냅샷을 저장하는 객체

commit 196
tree 92b8b6...
parent 8f2a5c...
author John <john@email.com>
committer John <john@email.com>
Initial commit

🏷️ Tag

특정 커밋에 대한 주석이 달린 태그

tag 152
object 9da581...
type commit
tag v1.0.0
tagger John <john@email.com>

🧠 고급 개념들

🔗 SHA-1 해싱과 내용 주소 방식

Git은 모든 객체를 SHA-1 해시로 식별합니다. 같은 내용은 항상 같은 해시를 가지므로 중복을 자동으로 제거할 수 있습니다.

echo "hello world" | git hash-object --stdin
3b18e512dba79e4c8300dd08aeb37f8e728b8dad

💾 압축과 성능 최적화

Git은 델타 압축과 팩 파일을 통해 저장 공간을 최적화합니다. 유사한 객체들 간의 차이점만 저장하여 효율성을 높입니다.

git gc --aggressive
# 저장소 최적화 및 압축

🔒 무결성과 보안

SHA-1 해시는 데이터의 무결성을 보장합니다. 파일이나 커밋 히스토리가 변조되면 해시가 달라져서 즉시 감지할 수 있습니다.

🌿 브랜치의 가벼움

Git의 브랜치는 단순히 특정 커밋을 가리키는 포인터입니다. 새 브랜치 생성은 40바이트 파일 하나를 만드는 것과 같습니다.

💡실무에서 알아두면 좋은 점들

  • .git/index 파일이 손상되면 git reset으로 복구할 수 있습니다
  • objects/ 폴더의 객체는 절대 변경되지 않습니다 (불변성)
  • 같은 파일이 여러 커밋에 있어도 실제로는 하나의 blob 객체만 저장됩니다
  • git fsck 명령으로 저장소 무결성을 검사할 수 있습니다
  • 대용량 파일은 Git LFS를 사용하여 별도로 관리하는 것이 좋습니다
  • HEAD 파일은 현재 브랜치를 나타내며, detached HEAD 상태에서는 커밋 해시를 직접 가리킵니다