Git 내부 구조 이해
Git이 파일을 어떻게 관리하는지, 3개의 영역을 통해 완전히 이해합니다. 이것을 이해하면 나머지 모든 게 쉬워집니다.
- Working Directory, Staging Area, Repository 3영역을 설명할 수 있다
- 파일이 각 영역을 어떻게 이동하는지 이해한다
- Untracked, Modified, Staged, Committed 상태를 구분할 수 있다
git status로 현재 상태를 파악할 수 있다
1. Git의 3가지 영역
Git은 파일을 3개의 영역으로 나누어 관리합니다. 이 3개의 영역을 이해하는 것이 Git의 핵심입니다.
git restore 또는 git checkout 으로 되돌리기 가능
.git이 바로 이곳입니다.2. 파일의 4가지 상태
Git에서 파일은 항상 아래 4가지 상태 중 하나에 있습니다.
(새 파일)
(커밋 대기)
(저장 완료)
(변경 감지)
git add → Staged → git commit → Committed (다시 반복)
git status 로 상태 확인하기
git status는 현재 3영역의 파일 상태를 한눈에 보여주는 가장 중요한 명령어입니다.
$ 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
3. Staging Area가 왜 필요할까?
처음에는 의문이 듭니다. "그냥 수정하고 바로 저장하면 안 되나요?"
"fix: 로그인/회원가입 버그 수정"
"feat: 헤더/푸터 퍼블리싱"
4. .git 폴더란?
git init을 실행하면 프로젝트 폴더에 숨김 폴더 .git이 생성됩니다. 이 폴더가 바로 Local
Repository입니다.
$ ls -al
drwxr-xr-x .git ← 이 폴더가 저장소! 절대 삭제하지 마세요
-rw-r--r-- index.html
-rw-r--r-- style.css
.git 폴더를 절대 삭제하지 마세요! 삭제하면 모든 커밋 이력이 사라집니다. 이 폴더가 Git 저장소의 전부입니다.
git status 출력에서 "Changes to be committed"가 어느 영역인지 알 수 있다
git status
git add 파일명
git add .
git restore --staged 파일명
이론에서 배운 Working Directory → Staging Area → Repository 흐름을 직접 따라합니다. 매
단계 git status로 변화를 확인하세요.
빈 폴더를 만들고 Git 저장소로 초기화합니다. .git 폴더(= Local
Repository)가 생성됩니다.
$ mkdir git-practice && cd git-practice
$ git init
Initialized empty Git repository in .../git-practice/.git/
새 파일을 만들면 Git이 Untracked로 인식합니다. 이론의 "추적 안 됨" 상태를 눈으로 확인하세요.
$ touch index.html
$ git status
Untracked files:
index.html ← Git이 아직 모르는 상태!
git add로 Staging Area(커밋 대기실)로 이동합니다. status의
"Changes to be committed"가 이 영역입니다.
$ git add index.html
$ git status
Changes to be committed:
new file: index.html ← Staging Area에 있음!
커밋하면 Staging Area가 비워지고 Repository에 버전이 생깁니다. "nothing to commit"이 건강한 상태입니다.
$ git commit -m "feat: index.html 추가"
[main (root-commit) a3f82bc] feat: index.html 추가
$ git status
nothing to commit, working tree clean
커밋된 파일을 수정하면 Modified 상태가 됩니다. 다시 add → commit 해야 새 버전이 생깁니다.
$ echo "<h1>Hello Git</h1>" > index.html
$ git status
Changes not staged for commit:
modified: index.html ← Modified!
Staging Area의 진짜 쓰임! 파일 2개를 만들고 관련 있는 것끼리 따로 커밋합니다.
$ 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 저장소 밖에 파일을 만들었거나 다른 폴더에 있을 수 있습니다.
pwd와 ls로 위치와 파일을 확인하세요. Git 저장소 폴더
안에 파일이 있어야 합니다.
git add . 했는데 특정 파일만 빼고 싶어요add 이후에도 Staging Area에서 꺼낼 수 있습니다.
git restore --staged 파일명으로 해당 파일만 빼낼 수 있습니다. 파일
내용은 그대로입니다.
.git 폴더를 실수로 삭제했어요!.git 폴더가 삭제되면 모든 커밋 이력이 사라집니다.
GitHub에 push해둔 게 있다면 git clone으로 복구 가능합니다. 평소
자주 push하는 습관이 중요합니다!