Part 1 0 / 9 챕터 완료
Chapter 03

Git 내부 구조 이해

Git이 파일을 어떻게 관리하는지, 3개의 영역을 통해 완전히 이해합니다. 이것을 이해하면 나머지 모든 게 쉬워집니다.

🎯 이 챕터를 마치면
  • Working Directory, Staging Area, Repository 3영역을 설명할 수 있다
  • 파일이 각 영역을 어떻게 이동하는지 이해한다
  • Untracked, Modified, Staged, Committed 상태를 구분할 수 있다
  • git status로 현재 상태를 파악할 수 있다

🏗️ 1. Git의 3가지 영역

Git은 파일을 3개의 영역으로 나누어 관리합니다. 이 3개의 영역을 이해하는 것이 Git의 핵심입니다.

Git의 3영역과 명령어 흐름
📁
Working Directory
작업 공간
● index.html NEW
● style.css MODIFIED
○ app.js
git add
📋
Staging Area
커밋 대기실
● index.html
● style.css
git commit
💾
Local Repository
버전 저장소
◆ Commit v3
◆ Commit v2
◆ Commit v1
git restore 또는 git checkout 으로 되돌리기 가능
📁
Working Directory
실제로 파일을 편집하는 공간. 평소에 우리가 파일을 열고 수정하는 그 폴더입니다.
📋
Staging Area
다음 커밋에 포함할 파일을 선택해서 모아두는 공간. "커밋 대기실"이라고 생각하세요.
💾
Local Repository
커밋된 버전들이 영구적으로 저장되는 공간. 프로젝트 폴더 안의 숨김 폴더 .git이 바로 이곳입니다.

🔄 2. 파일의 4가지 상태

Git에서 파일은 항상 아래 4가지 상태 중 하나에 있습니다.

파일 상태 변화 흐름
📄
Untracked
추적 안 됨
(새 파일)
git add
📑
Staged
스테이징됨
(커밋 대기)
git commit
Committed
커밋됨
(저장 완료)
수정 후
✏️
Modified
수정됨
(변경 감지)
Modified → git add → Staged → git commit → Committed (다시 반복)

git status 로 상태 확인하기

git status는 현재 3영역의 파일 상태를 한눈에 보여주는 가장 중요한 명령어입니다.

Git Bash — 실행 결과 예시
$ git status
On branch main

Changes to be committed:       ← Staging Area에 있는 파일
  (use "git restore --staged <file>" to unstage)
        new file:   index.html
        modified:   style.css

Changes not staged for commit: ← Modified (수정됐지만 add 안 된 파일)
  (use "git add <file>" to update what will be committed)
        modified:   README.md

Untracked files:               ← Git이 아직 모르는 새 파일
  (use "git add <file>" to include in what will be committed)
        app.js
Changes to be committed
Staging Area에 있는 파일들. git commit하면 저장됩니다.
Changes not staged
수정은 됐지만 git add를 안 한 파일들. Staging Area에 올려야 합니다.
Untracked files
Git이 한 번도 추적한 적 없는 새 파일. git add로 추적 시작.

💡 3. Staging Area가 왜 필요할까?

처음에는 의문이 듭니다. "그냥 수정하고 바로 저장하면 안 되나요?"

Staging Area가 있는 이유 — 선택적 커밋
오늘 수정한 파일 목록
✏️ login.js — 로그인 버그 수정
✏️ signup.js — 회원가입 버그 수정
✏️ footer.html — 퍼블리싱 작업
✏️ header.html — 퍼블리싱 작업
Staging Area로 나눠서 커밋
Commit 1
login.js + signup.js
"fix: 로그인/회원가입 버그 수정"
Commit 2
footer.html + header.html
"feat: 헤더/푸터 퍼블리싱"
✅ Staging Area 덕분에 관련 있는 변경사항끼리 묶어서 의미있는 커밋 단위를 만들 수 있다

📦 4. .git 폴더란?

git init을 실행하면 프로젝트 폴더에 숨김 폴더 .git이 생성됩니다. 이 폴더가 바로 Local Repository입니다.

Git Bash
$ ls -al
drwxr-xr-x  .git   ← 이 폴더가 저장소! 절대 삭제하지 마세요
-rw-r--r--  index.html
-rw-r--r--  style.css
🚨

.git 폴더를 절대 삭제하지 마세요! 삭제하면 모든 커밋 이력이 사라집니다. 이 폴더가 Git 저장소의 전부입니다.

✅ 이해도 체크
Working Directory, Staging Area, Repository 3영역의 역할을 각각 설명할 수 있다
파일이 Untracked → Staged → Committed로 이동하려면 어떤 명령어가 필요한지 안다
git status 출력에서 "Changes to be committed"가 어느 영역인지 알 수 있다
Staging Area가 왜 필요한지 설명할 수 있다
📌 이 챕터 핵심 명령어
git status
현재 3영역의 파일 상태 확인 (가장 자주 씀!)
git add 파일명
Working Dir → Staging Area로 파일 이동
git add .
모든 변경 파일을 Staging Area로 이동
git restore --staged 파일명
Staging Area에서 되돌리기 (unstaing)
🔨 실습 해보기
3영역을 눈으로 확인하며 첫 버전 만들기

이론에서 배운 Working Directory → Staging Area → Repository 흐름을 직접 따라합니다. 매 단계 git status로 변화를 확인하세요.

0 / 6 완료
1
실습 폴더 만들고 git init

빈 폴더를 만들고 Git 저장소로 초기화합니다. .git 폴더(= Local Repository)가 생성됩니다.

Git Bash
$ mkdir git-practice && cd git-practice
$ git init
Initialized empty Git repository in .../git-practice/.git/
Step 1 완료 후 상태
Working Dir
(비어있음)
git add
Staging Area
(비어있음)
git commit
Repository
.git 생성!
touch index.html
2
파일 생성 → Untracked 상태 확인

새 파일을 만들면 Git이 Untracked로 인식합니다. 이론의 "추적 안 됨" 상태를 눈으로 확인하세요.

Git Bash
$ touch index.html
$ git status
Untracked files:
        index.html   ← Git이 아직 모르는 상태!
Step 2 완료 후 상태
Working Dir
🔴 index.html (Untracked)
git add
Staging Area
(비어있음)
git commit
Repository
(비어있음)
git add index.html
3
git add → Staged 상태 확인

git add로 Staging Area(커밋 대기실)로 이동합니다. status의 "Changes to be committed"가 이 영역입니다.

Git Bash
$ git add index.html
$ git status
Changes to be committed:
        new file:   index.html  ← Staging Area에 있음!
Step 3 완료 후 상태
Working Dir
○ index.html
git add ✅
Staging Area
🟡 index.html (Staged)
git commit
Repository
(비어있음)
git commit -m "feat: index.html 추가"
4
git commit → Repository에 버전 저장

커밋하면 Staging Area가 비워지고 Repository에 버전이 생깁니다. "nothing to commit"이 건강한 상태입니다.

Git Bash
$ git commit -m "feat: index.html 추가"
[main (root-commit) a3f82bc] feat: index.html 추가
$ git status
nothing to commit, working tree clean
Step 4 완료 후 상태
Working Dir
○ index.html
git add
Staging Area
(비어있음)
git commit ✅
Repository
◆ a3f82bc
5
파일 수정 → Modified 상태 확인

커밋된 파일을 수정하면 Modified 상태가 됩니다. 다시 add → commit 해야 새 버전이 생깁니다.

Git Bash
$ echo "<h1>Hello Git</h1>" > index.html
$ git status
Changes not staged for commit:
        modified:   index.html   ← Modified!
Step 5 완료 후 상태
Working Dir
🟠 index.html (Modified)
git add
Staging Area
(비어있음)
git commit
Repository
◆ v1
git add index.html && git commit
6
Staging Area 활용 — 파일 2개를 따로따로 커밋

Staging Area의 진짜 쓰임! 파일 2개를 만들고 관련 있는 것끼리 따로 커밋합니다.

Git Bash
$ touch login.html signup.html
$ git add login.html
$ git commit -m "feat: 로그인 페이지 추가"
$ git add signup.html
$ git commit -m "feat: 회원가입 페이지 추가"
$ git log --oneline
c3d2e1f feat: 회원가입 페이지 추가
b7a9f3c feat: 로그인 페이지 추가
a3f82bc feat: index.html 추가
🎯

Staging Area 덕분에 수정 파일이 많아도 관련 파일끼리 묶어 의미 있는 커밋을 만들 수 있습니다!

🧪 이런 상황, 어떻게 할까요?
😰git status를 했는데 "not a git repository" 오류가 나요

현재 폴더에서 git init을 아직 실행하지 않았습니다.

git init을 먼저 실행하세요. pwd로 위치를 확인 후 올바른 폴더에서 실행하세요.

😕파일 만들었는데 git status에 아무것도 안 보여요

Git 저장소 밖에 파일을 만들었거나 다른 폴더에 있을 수 있습니다.

pwdls로 위치와 파일을 확인하세요. Git 저장소 폴더 안에 파일이 있어야 합니다.

😱git add . 했는데 특정 파일만 빼고 싶어요

add 이후에도 Staging Area에서 꺼낼 수 있습니다.

git restore --staged 파일명으로 해당 파일만 빼낼 수 있습니다. 파일 내용은 그대로입니다.

💀.git 폴더를 실수로 삭제했어요!

.git 폴더가 삭제되면 모든 커밋 이력이 사라집니다.

GitHub에 push해둔 게 있다면 git clone으로 복구 가능합니다. 평소 자주 push하는 습관이 중요합니다!

🎉 모든 Step 완료! 3영역 흐름을 직접 손으로 확인했습니다.