03. Git 저장소(Repository)

🎯 이 장의 목표
  • 저장소(repository)가 무엇인지 이해한다
  • 저장소를 직접 만들고(git init), .git 폴더의 정체를 안다
  • 워킹 디렉터리 / 스테이지 영역의 개념을 명확히 한다
  • 파일 상태를 확인하고(git status), 추적 제외(.gitignore)를 설정한다

3.1 저장소(Repository)란?

저장소(레포지토리, 줄여서 "레포")는 Git이 버전 이력을 관리하는 하나의 프로젝트 공간입니다. 쉽게 말해, "Git이 감시하고 있는 폴더"입니다.

일반 폴더와 Git 저장소의 차이는 단 하나, .git이라는 숨겨진 폴더의 존재 여부입니다.

CODE
my-project/          ← 일반 폴더
my-project/.git/     ← 이 폴더가 생기는 순간, Git 저장소가 된다!

3.2 저장소 만들기 — git init

빈 폴더를 만들고 그 안에서 git init을 실행하면 저장소가 됩니다. 직접 해봅시다.

BASH
# 1. 연습용 폴더 생성 후 이동
mkdir git-practice
cd git-practice

# 2. Git 저장소로 초기화
git init
CODE
# 출력 예시
Initialized empty Git repository in /home/user/git-practice/.git/

축하합니다! 이 폴더는 이제 Git 저장소입니다. 무슨 일이 일어났는지 확인해봅시다.

BASH
ls -a        # 숨김 파일까지 모두 보기
CODE
.   ..   .git

.git 폴더가 새로 생겼습니다. 이 폴더가 바로 Git의 두뇌입니다.

3.3 .git 폴더 안에는 무엇이 있을까? (숨겨진 진실)

.git 폴더 안을 살짝 들여다봅시다.

BASH
ls .git
CODE
HEAD  config  description  hooks/  info/  objects/  refs/
항목역할
HEAD"지금 내가 어느 브랜치/커밋에 있는지" 가리키는 포인터
config이 저장소의 로컬 설정 (앞 장에서 본 그것)
objects/실제 데이터(커밋, 파일 내용)가 저장되는 핵심 폴더
refs/브랜치와 태그가 가리키는 커밋 정보
hooks/특정 시점에 자동 실행할 스크립트
⚠️ 흔한 실수
절대 하지 말 것: .git 폴더를 직접 수정하거나 삭제하지 마세요. 이 폴더를 지우면 모든 버전 이력이 사라집니다. (단, 파일 내용 자체는 워킹 디렉터리에 남아있습니다.) 저장소를 "그냥 평범한 폴더로 되돌리고" 싶을 때만 의도적으로 .git을 삭제합니다.
🧠 기억하세요: 이력은 클라우드가 아니라 .git 폴더 안에 들어있습니다. 그래서 인터넷 없이도 모든 작업이 가능한 것입니다.

3.4 워킹 디렉터리(Working Directory)란?

워킹 디렉터리는 우리가 실제로 파일을 보고, 만들고, 수정하는 작업 공간입니다. 쉽게 말해 .git 폴더를 제외한 저장소 폴더 그 자체입니다.

CODE
git-practice/        ← 이 폴더 = 워킹 디렉터리
├── index.html       ← 내가 보고 수정하는 실제 파일들
├── style.css
└── .git/            ← 이건 Git의 영역 (워킹 디렉터리 아님)

우리가 코드를 짜는 모든 활동은 워킹 디렉터리에서 일어납니다. Git은 이 워킹 디렉터리를 감시하면서 "어떤 파일이 새로 생겼고, 바뀌었고, 지워졌는지"를 추적합니다.

3.5 스테이지 영역(Staging Area / Index)이란?

스테이지는 "다음 커밋에 포함시킬 변경 사항을 모아두는 대기실"입니다. (영어로 Index라고도 부릅니다.)

🛒 장바구니 비유
  • 워킹 디렉터리 = 매장 전체 (모든 상품이 놓인 곳)
  • 스테이지 = 장바구니 (살 물건만 담음)
  • 커밋 = 결제 (장바구니에 담은 것만 영수증에 기록됨)

매장에 상품이 100개 있어도, 장바구니(스테이지)에 담은 것만 결제(커밋)됩니다.

이 "장바구니" 단계가 있어서 Git은 강력합니다. 수정한 여러 파일 중 일부만 골라서 커밋할 수 있기 때문입니다.

flowchart LR
    subgraph WD["🖥️ 워킹 디렉터리"]
        A1["파일 A 수정"]
        B1["파일 B 수정"]
        C1["파일 C 수정"]
    end
    subgraph SA["📦 스테이지"]
        A2["파일 A"]
    end
    subgraph REPO["🗄️ 저장소"]
        A3["커밋! (A만 기록)"]
    end
    A1 -- "git add A" --> A2
    A2 -- "git commit" --> A3
    B1 -. "담지 않음" .-> SA
    C1 -. "담지 않음" .-> SA
    classDef work fill:#fef3c7,stroke:#d97706,color:#92400e
    classDef stage fill:#dbeafe,stroke:#2563eb,color:#1e40af
    classDef repo fill:#dcfce7,stroke:#16a34a,color:#166534
    class A1,B1,C1 work
    class A2 stage
    class A3 repo

3.6 파일 상태 확인하기 — git status

git statusGit에서 가장 자주 쓰는 명령입니다. "지금 내 저장소가 어떤 상태인지" 알려줍니다. 막힐 때마다 일단 git status를 치는 습관을 들이세요.

BASH
git status

방금 만든 빈 저장소라면:

CODE
On branch main

No commits yet

nothing to commit (working tree clean)

이제 파일을 하나 만들어 봅시다.

BASH
echo "Hello Git" > readme.txt
git status
CODE
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        readme.txt

nothing added to commit but untracked files present

readme.txtUntracked(추적되지 않음) 상태로 표시됩니다. "이런 새 파일이 있는데, 관리할 거야?"라고 Git이 물어보는 것입니다.

파일 상태의 종류

상태의미status 표시
UntrackedGit이 아직 모르는 새 파일Untracked files
Tracked - Unmodified추적 중이고 변경 없음(표시 안 됨, 깨끗함)
Tracked - Modified추적 중인데 수정됨Changes not staged
Tracked - Staged커밋 대기 중 (장바구니에 담김)Changes to be committed

짧게 보기 — git status -s

BASH
git status -s
CODE
?? readme.txt      # ?? = untracked
 M style.css       # M(오른쪽) = 수정됐지만 stage 안 됨
M  index.html      # M(왼쪽)  = stage 됨
A  newfile.js      # A = 새로 stage된 파일

소스트리에서 상태 확인

소스트리를 열면 화면이 직관적으로 나뉩니다.

  • Unstaged files (아래) = 스테이지 안 된 변경/새 파일
  • Staged files (위) = 커밋 대기 중인 파일
  • 파일을 클릭하면 오른쪽에 변경 내용(diff)이 보입니다.

CLI의 git status와 정확히 같은 정보를 시각적으로 보여주는 것입니다.

3.7 버전 관리에서 제외하기 — .gitignore

모든 파일을 Git으로 관리할 필요는 없습니다. 다음과 같은 파일은 추적하면 안 됩니다.

  • 비밀번호·API 키가 든 설정 파일 (.env)
  • 자동 생성되는 빌드 결과물 (build/, dist/)
  • 의존성 폴더 (node_modules/ — 수만 개 파일!)
  • OS가 만드는 잡동사니 (.DS_Store, Thumbs.db)
  • 로그 파일 (*.log)
📌 핵심
잠깐, 용어 정리
  • API 키: 외부 서비스를 쓸 때 "나는 허가된 사용자"임을 증명하는 비밀 문자열. 노출되면 도용될 수 있어 추적 금지.
  • 빌드(build): 사람이 쓴 소스 코드를 컴퓨터가 실행할 형태로 변환·조립하는 과정. 그 결과물(build/, dist/)은 언제든 다시 만들 수 있으니 저장할 필요가 없습니다.
  • 의존성(dependency): 내 프로젝트가 가져다 쓰는 외부 라이브러리(남이 만든 코드 꾸러미). node_modules/는 그 라이브러리들이 설치되는 폴더로, 설정 파일만 있으면 언제든 다시 내려받을 수 있습니다.

이런 파일은 저장소 루트에 .gitignore라는 파일을 만들어 등록하면 Git이 무시합니다.

BASH
# .gitignore 파일 만들기
touch .gitignore

.gitignore 내용 예시:

GITIGNORE
# 주석은 #으로 시작
node_modules/        # 폴더 전체 무시
.env                 # 특정 파일 무시
*.log                # .log로 끝나는 모든 파일
build/               # 빌드 폴더
.DS_Store            # macOS 잡파일

# 예외: logs 폴더는 무시하되 important.log만은 추적
logs/*
!logs/important.log
패턴의미
node_modules/해당 폴더 전체 무시
*.log확장자가 .log인 모든 파일 무시
/temp루트의 temp만 무시 (하위 폴더 temp는 추적)
!important.log무시 규칙의 예외 (느낌표 = "이건 추적해")
💡 팁
꿀팁: 프로젝트 언어/프레임워크별 .gitignore 템플릿을 github.com/github/gitignore에서 무료로 받을 수 있습니다. Node.js, Python, Java 등 거의 모든 환경이 준비돼 있습니다.
⚠️ 흔한 실수
흔한 실수: 이미 커밋된 파일은 나중에 .gitignore에 추가해도 계속 추적됩니다. .gitignore"아직 추적 안 된 파일"에만 효력이 있습니다. 이미 추적 중인 파일을 빼려면 git rm --cached 파일명을 써야 합니다.

3.8 기존 저장소 복제하기 — git clone (맛보기)

이미 GitHub 등에 있는 저장소를 통째로 내 컴퓨터로 가져오려면 git clone을 씁니다. (자세한 내용은 원격 저장소 장에서 다룹니다.)

BASH
git clone https://github.com/사용자명/저장소명.git

이 한 줄로 전체 이력을 포함한 완전한 복사본이 만들어집니다. git init은 "새 저장소 생성", git clone은 "기존 저장소 복사"라는 점이 다릅니다.

3.9 이 장에서 배운 것 (요약)

  • 저장소 = Git이 관리하는 폴더 (= .git 폴더가 있는 폴더)
  • git init으로 새 저장소 생성, git clone으로 기존 저장소 복사
  • .git 폴더는 모든 이력의 보관소 — 절대 함부로 건드리지 말 것
  • 워킹 디렉터리(작업 공간) → 스테이지(장바구니) → 저장소(영수증)
  • git status로 상태를 수시로 확인하라 (가장 자주 쓰는 명령)
  • .gitignore로 추적하지 않을 파일을 지정한다

✍️ 확인 문제

  1. 일반 폴더와 Git 저장소를 구분하는 결정적 차이는?
  2. node_modules/를 Git이 무시하게 하려면 어떻게 하나요?
  3. "장바구니" 비유에서 결제(커밋)되는 것은 무엇인가요?
다음 장에서는 이 장바구니에 담고(add) 결제하는(commit) 과정을 본격적으로 다룹니다. → 04_커밋.md