01-01 Git 개념과 동작 원리
Git이 무엇이고 내부적으로 어떻게 동작하는지 — 스냅샷 모델과 4개 영역을 이해하면 모든 명령이 쉬워진다.
Git이 무엇이고 내부적으로 어떻게 동작하는지 — 스냅샷 모델과 4개 영역을 이해하면 모든 명령이 쉬워진다.
목표: “지금 내 변경이 어느 영역에 있는지” 항상 머릿속에 그릴 수 있는 수준
🎯 Git이란
분산 버전 관리 시스템(DVCS, Distributed Version Control System). 모든 개발자가 전체 히스토리를 담은 저장소 복제본을 가진다.
graph TB
subgraph "중앙집중식 (SVN)"
CS["중앙 서버"] --- C1["작업본"]
CS --- C2["작업본"]
end
subgraph "분산식 (Git)"
R["원격"] --- L1["전체 복제본 + 히스토리"]
R --- L2["전체 복제본 + 히스토리"]
end
| 구분 | 중앙집중식(SVN) | 분산식(Git) |
|---|---|---|
| 히스토리 | 서버에만 | 모든 복제본 |
| 오프라인 작업 | 제한적 | 완전 가능 |
| 속도 | 네트워크 의존 | 로컬에서 빠름 |
| 브랜치 | 무거움 | 가볍고 빠름 |
📸 핵심: Git은 “스냅샷”을 저장한다
대부분의 VCS는 파일별 변경분(delta) 을 저장한다. Git은 다르다 — 매 커밋마다 프로젝트 전체의 스냅샷을 찍는다.
graph LR
subgraph "커밋마다 스냅샷"
C1["Commit 1<br/>A B C"] --> C2["Commit 2<br/>A B' C"]
C2 --> C3["Commit 3<br/>A B' C'"]
end
- 바뀐 파일만 새로 저장하고, 안 바뀐 파일은 이전 스냅샷을 가리키는 포인터만 남긴다 → 공간 효율적
- 그래서 브랜치 전환·히스토리 탐색이 매우 빠르다
🗂️ 4개의 영역
graph LR
WD["💻 Working Directory<br/>(작업 디렉토리)"] -->|"git add"| STAGE["📋 Staging Area<br/>(Index)"]
STAGE -->|"git commit"| REPO["📦 Local Repository<br/>(.git)"]
REPO -->|"git push"| REMOTE["🌐 Remote"]
REMOTE -->|"git fetch"| REPO
REPO -->|"git checkout"| WD
| 영역 | 의미 | 확인 |
|---|---|---|
| Working Directory | 실제 편집 중인 파일들 | git status |
| Staging Area (Index) | 다음 커밋에 담을 변경을 모아두는 곳 | git diff --staged |
| Local Repository | 커밋된 히스토리 (.git 폴더) | git log |
| Remote | 원격 공유 저장소 | git remote -v |
[!tip] Staging Area가 핵심 다른 VCS에 없는 Git만의 중간 단계. 작업한 변경 중 일부만 골라 커밋할 수 있게 해준다(
git add -p). 커밋을 논리적 단위로 쪼개는 힘의 원천.
🔑 핵심 용어
| 용어 | 설명 |
|---|---|
| commit | 스냅샷 + 메타데이터(작성자/시간/메시지/부모). SHA-1 해시로 식별 |
| HEAD | 현재 위치(보통 현재 브랜치의 최신 커밋)를 가리키는 포인터 |
| branch | 특정 커밋을 가리키는 움직이는 포인터 (커밋하면 따라 이동) |
| tag | 특정 커밋을 가리키는 고정 포인터 (보통 릴리스 버전) |
| origin | 기본 원격 저장소의 관례적 이름 |
graph RL
C1["C1"] --> C0["C0"]
C2["C2"] --> C1
C3["C3"] --> C2
MAIN["main"] -.-> C3
HEAD["HEAD"] -.-> MAIN
FEAT["feature"] -.-> C2
각 커밋은 부모 커밋을 가리키며 사슬을 이룬다. 브랜치는 그 사슬 위의 한 지점을 가리키는 이름표일 뿐이다.
⚙️ 설치와 초기 설정
설치 확인
git --version
필수 설정 (커밋에 기록됨)
git config --global user.name "Jongmin"
git config --global user.email "you@example.com"
권장 설정
git config --global init.defaultBranch main # 기본 브랜치명
git config --global core.editor "code --wait" # 커밋 메시지 에디터
git config --global core.autocrlf true # Windows 줄바꿈
git config --global core.autocrlf input # mac/Linux 줄바꿈
git config --global pull.rebase true # pull 시 rebase
설정 확인
git config --list --show-origin # 각 설정의 출처 파일까지
설정 범위 우선순위: --local(저장소) > --global(사용자) > --system(전체)
📋 체크리스트
- 분산 VCS의 의미와 장점 설명
- “스냅샷 vs 변경분(delta)” 차이 이해
- 4개 영역과 변경이 흐르는 방향
- Staging Area의 존재 이유
- commit/HEAD/branch/tag 관계 그리기
- user.name/email 설정 완료
- config 범위 우선순위 이해
🔗 관련 노트
- 00-MOC-Git — Git 노트 지도
- 01-02-기본-명령어와-워크플로우 — 다음: 실제 명령어
- 03-01-Git-내부-객체-모델 — 심화: 스냅샷의 실제 저장 방식
마지막 업데이트: 2026-06-02