Git 내부 구조 (Advanced)
1. 🔐 Git 객체의 SHA-1 해시 구조
1.1 개요
Git은 모든 객체(blob, tree, commit 등)를 SHA-1 해시 값을 통해 식별한다.
하나의 커밋은 고유한 40자리 16진수 해시로 구분됨
1.2 예시
e83c5163... ← 커밋, 블롭, 트리 모두 이 해시값으로 관리됨
1.3 내부 생성 방식
- Git은 객체의 타입 + 크기 + 내용을 문자열로 만듦
예:blob 12\0Hello World\n
- 이를 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은 중앙 & 단순 |