Git - 01 -구조와 코드 저장 방식
📌 Git의 구조와 코드 저장 방식
Git은 단순한 파일 저장소가 아니라 분산형 버전 관리 시스템(DVCS) 입니다.
즉, 파일의 변경 내역을 기록하고, 언제든 과거 버전으로 되돌릴 수 있도록 관리하는 시스템입니다.
Git의 구조는 크게 다음과 같은 4가지 핵심 요소로 이루어집니다:
1️⃣ Git의 기본 구조
작업 디렉토리 (Working Directory) ---> 스테이징 영역 (Staging Area) ---> 로컬 저장소 (Local Repository) ---> 원격 저장소 (Remote Repository)
영역 | 역할 |
---|---|
작업 디렉토리 (Working Directory) | 사용자가 작업하는 실제 파일이 있는 곳 |
스테이징 영역 (Staging Area, Index) | 커밋할 준비가 된 변경 사항을 저장 |
로컬 저장소 (Local Repository) | 사용자의 PC에 저장되는 Git 데이터베이스 (.git 폴더) |
원격 저장소 (Remote Repository) | GitHub, GitLab 등 원격 서버에 저장된 저장소 |
2️⃣ Git의 내부 구조
Git은 파일을 일반적인 방식으로 저장하지 않고, SHA-1 해시를 기반으로 한 객체 저장소를 사용합니다.
파일을 변경할 때마다 전체 파일을 저장하는 것이 아니라, 차이점(Diff)과 스냅샷(Snapshot)을 저장합니다.
Git 저장 방식은 4가지 주요 객체를 통해 관리됩니다:
- Blob (Binary Large Object)
- Tree (트리)
- Commit (커밋)
- Tag (태그)
📌 1. Blob (블롭) – 파일 내용 저장
✅ Blob은 Git이 파일을 저장하는 방식입니다.
✅ Git은 파일을 그대로 저장하지 않고, 파일의 내용을 해시(SHA-1) 값으로 변환하여 저장합니다.
📌 예제:
echo "Hello Git" > hello.txt # 파일 생성
git add hello.txt # 스테이징
이때 hello.txt
파일의 내용이 SHA-1 해시값을 사용하여 .git/objects/
내부에 저장됩니다.
📌 저장 방식 예시 (ls .git/objects/
)
.git/objects/
├── a1
│ └── b2c3d4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9
💡 즉, Git은 파일을 직접 저장하는 것이 아니라, 파일 내용을 해시로 변환하여 Blob으로 저장함!
📌 2. Tree (트리) – 디렉토리 구조 저장
✅ Tree는 파일과 폴더(디렉토리) 구조를 저장하는 객체입니다.
✅ 커밋할 때 Tree는 Blob과 Tree를 포함하여 폴더 구조를 유지합니다.
📌 예제:
mkdir project
cd project
echo "Hello Git" > file1.txt
echo "Git is amazing" > file2.txt
git add .
git commit -m "Initial commit"
이제 .git/objects/
내부에는 Tree 객체가 생성됩니다.
📌 Tree 저장 방식
Tree
├── Blob (file1.txt)
├── Blob (file2.txt)
└── Tree (서브 디렉토리)
💡 즉, Tree는 Blob(파일)과 다른 Tree(폴더)를 연결하여 파일 시스템 구조를 저장함!
📌 3. Commit (커밋) – 버전 정보 저장
✅ Commit은 Git이 변경 사항을 기록하는 방식입니다.
✅ Commit은 Tree를 가리키며, 이전 커밋(Parent Commit)을 포함하여 연결 리스트 형태로 저장됩니다.
📌 커밋 예제
git commit -m "Add file1.txt and file2.txt"
이제 .git/objects/
내부에 Commit 객체가 생성됩니다.
📌 Commit 저장 방식
Commit
├── Parent Commit (이전 커밋)
├── Tree (현재 디렉토리 구조)
├── Author (작성자)
└── Message (커밋 메시지)
💡 즉, Commit은 특정 시점의 Tree를 가리키며, 변경 이력을 연결하는 역할!
📌 4. Tag (태그) – 특정 커밋에 레이블 지정
✅ Tag는 특정 커밋을 가리키는 객체입니다.
✅ 보통 소프트웨어 버전(Tag v1.0.0 등)을 만들 때 사용됩니다.
📌 태그 생성 예제
git tag v1.0.0
git show v1.0.0 # 태그 상세 정보 확인
💡 즉, Tag는 특정 커밋을 쉽게 참조할 수 있도록 하는 라벨 역할!
📌 Git의 전체 저장 과정
Git에서 파일이 어떻게 저장되는지 전체 과정을 정리하면 다음과 같습니다:
🚀 1. 파일 추가
[ Working Directory ]
|
|-- (git add) --> [ Staging Area ]
git add
실행 → Blob이 생성되고 Staging Area에 등록됨
🚀 2. 커밋
[ Staging Area ]
|
|-- (git commit) --> [ Local Repository ]
git commit
실행 → Tree + Commit 객체가 생성됨
🚀 3. 원격 저장소로 푸시
[ Local Repository ]
|
|-- (git push) --> [ Remote Repository ]
git push
실행 → 원격 저장소(GitHub 등)로 업로드됨
📌 정리: Git에서 코드가 저장되는 방식
| 영역 | 설명 | 저장 방식 |
|———-|———|————–|
| Working Directory | 사용자가 실제로 작업하는 파일 위치 | 일반 파일 시스템 |
| Staging Area | git add
후 커밋 대기 중인 변경 사항 | Blob (SHA-1 해시) |
| Local Repository | git commit
하면 저장되는 공간 | Commit + Tree + Blob |
| Remote Repository | git push
하면 업로드되는 원격 저장소 | 원격 서버 (GitHub, GitLab 등) |
🔍 마무리
📌 Git이 코드를 저장하는 방식
- 파일의 변경 사항을 직접 저장하는 것이 아니라, 해시(SHA-1) 기반의 Blob, Tree, Commit 구조로 저장
- Commit은 이전 커밋을 가리키면서 버전 이력을 관리하는 연결 리스트 형태
- Staging Area → Local Repository → Remote Repository 순서로 코드가 저장됨
- 각 단계마다 Git이 “변경 사항(스냅샷)”을 저장하고, 필요할 때 되돌릴 수 있음
Git이 단순히 파일을 저장하는 것이 아니라 버전 관리 시스템을 통해 데이터를 효율적으로 관리하는 방식입니다.
댓글남기기