Skip to main content

Git 내부 구조 (Advanced)


1. 🔐 Git 객체의 SHA-1 해시 구조

1.1 개요

Git은 모든 객체(blob, tree, commit 등)를 SHA-1 해시 값을 통해 식별한다.

하나의 커밋은 고유한 40자리 16진수 해시로 구분됨

1.2 예시

e83c5163... ← 커밋, 블롭, 트리 모두 이 해시값으로 관리됨

1.3 내부 생성 방식

  1. Git은 객체의 타입 + 크기 + 내용을 문자열로 만듦
    예: blob 12\0Hello World\n
  2. 이를 SHA-1으로 해싱하여 파일 이름으로 저장
echo "Hello World" | git hash-object --stdin
→ 557db03de997c86a4a028e1ebd3a1ceb225be238

2. Git의 packfile 압축 구조

2.1 개요

Git은 수천 개의 객체를 .git/objects 디렉토리에 저장하지만, 리포지토리가 커지면 성능 저하가 발생합니다. 이를 해결하기 위해 **packfile(.pack)**을 사용합니다.

2.2 packfile이란?

여러 Git 객체를 압축하고 델타(차이) 형태로 저장한 파일

2.3 저장 구조

.git/
└── objects/
    ├── pack/
    │   ├── pack-xxxxx.pack   ← 실제 압축된 객체
    │   └── pack-xxxxx.idx    ← 인덱스 파일

2.4 생성 명령어

git gc      # 자동으로 packfile 생성 (garbage collection)

2.5 특징

특징

설명

공간 절약

비슷한 파일은 델타 방식으로 저장됨

빠른 복사

clone, fetch, push 성능 향상

불변성 보장

packfile 내 객체는 변경 불가, 안전함


3. Git vs SVN 비교

항목

Git

SVN

저장 방식

분산 버전 관리 (DVCS)

중앙 집중식 (CVCS)

커밋 저장소

로컬과 원격 모두

중앙 서버

브랜치

가볍고 빠름 (포인터)

디렉토리 복사 방식

네트워크 필요 여부

X (로컬 커밋 가능)

O (항상 서버 접속 필요)

속도

빠름 (로컬 기반)

느림 (서버 기반)

merge & rebase

고급 기능 다양

제한적 기능

사용 예

GitHub, GitLab, OSS 등

일부 기업 내부 시스템

3.1 핵심 차이

| Git은 로컬에서도 모든 기능 사용 가능, 브랜치가 lightweight
→ 오프라인, 분기 많은 프로젝트에 최적화

| SVN은 중앙 서버 기반으로 단순하고 통제된 작업에 적합
→ 사내 규칙이 명확한 환경에 적합


요약

주제

요점

SHA-1 해시

Git 객체는 타입+내용 기반으로 해시 생성

packfile

성능 최적화를 위한 객체 압축 저장소

Git vs SVN

Git은 분산 & 유연, SVN은 중앙 & 단순