버전 관리란 무엇인가?
코드를 작성하다 보면 이런 상황이 생깁니다.
프로젝트_최종.zip
프로젝트_최종2.zip
프로젝트_최종_진짜최종.zip
프로젝트_최종_진짜최종_수정.zip
파일을 이렇게 복사하는 것도 일종의 버전 관리지만, Git은 이를 훨씬 체계적으로 처리합니다.
Git의 핵심 개념
flowchart LR
subgraph WD["작업 디렉토리"]
F1["파일 수정"]
end
subgraph SA["스테이징 영역"]
F2["커밋할 파일 선택"]
end
subgraph REPO["로컬 저장소"]
F3["커밋 (스냅샷)"]
end
WD -->|"git add"| SA
SA -->|"git commit"| REPO
Git은 파일의 변경 이력을 스냅샷 형태로 저장합니다. 언제든지 과거 시점으로 돌아갈 수 있습니다.
Git 설치 및 초기 설정
# 설치 확인
git --version
# git version 2.40.0
# 사용자 정보 설정 (최초 1회)
git config --global user.name "홍길동"
git config --global user.email "hong@example.com"
# 설정 확인
git config --list
저장소 초기화
# 새 프로젝트 시작
mkdir my-project
cd my-project
git init
# Initialized empty Git repository in .../my-project/.git/
# 또는 기존 폴더를 Git 저장소로
cd existing-folder
git init
git init을 실행하면 .git 폴더가 생성됩니다. 이 폴더에 모든 버전 정보가 담깁니다.
첫 커밋 만들기
# 파일 생성
echo "# 나의 첫 프로젝트" > README.md
# 상태 확인
git status
# Untracked files: README.md
# 스테이징 영역에 추가
git add README.md
# 커밋 (스냅샷 저장)
git commit -m "첫 번째 커밋: README 추가"
# 이력 확인
git log
# commit a1b2c3d (HEAD -> main)
# Author: 홍길동 <hong@example.com>
# Date: Mon Apr 21 14:00:00 2026
#
# 첫 번째 커밋: README 추가
Git이 저장하는 것
flowchart TB
C1["커밋 1\n'README 추가'\na1b2c3d"]
C2["커밋 2\n'기능 추가'\nb2c3d4e"]
C3["커밋 3\n'버그 수정'\nc3d4e5f"]
C1 -->|"이전 커밋 참조"| C2
C2 -->|"이전 커밋 참조"| C3
HEAD["HEAD\n현재 위치"] --> C3
각 커밋은 고유한 해시(ID)를 가집니다. 과거 커밋으로 돌아가거나 비교할 때 이 ID를 사용합니다.
.gitignore: 추적하지 않을 파일
모든 파일을 Git으로 관리할 필요는 없습니다.
# .gitignore 파일 생성
cat > .gitignore << EOF
# 환경변수 (API 키, 비밀번호)
.env
.env.local
# 의존성 폴더
node_modules/
__pycache__/
*.pyc
# 빌드 결과물
dist/
build/
.next/
# OS 파일
.DS_Store
Thumbs.db
# IDE 설정
.vscode/
.idea/
EOF
정리
| 개념 | 설명 |
|---|---|
| 저장소 (Repository) | 프로젝트의 모든 파일과 이력을 담는 공간 |
| 커밋 (Commit) | 특정 시점의 스냅샷 + 메시지 |
| 스테이징 영역 | 커밋할 파일을 준비하는 중간 단계 |
| HEAD | 현재 작업 중인 위치 |
| .gitignore | Git이 무시할 파일/폴더 목록 |
다음 편에서는 기본 명령어 — add, commit, log, diff, status를 자유롭게 사용하는 방법을 배웁니다.