[이제와서 시작하는 GitHub 마스터하기 - 기초편 #8] git add와 commit: 변경사항 관리의 모든 것
[이제와서 시작하는 GitHub 마스터하기 - 기초편 #8] git add와 commit: 변경사항 관리의 모든 것
학습 목표
이 장을 마치면 다음을 할 수 있습니다:
- ✅ Git의 4단계 작업 흐름을 완벽히 이해할 수 있습니다
- ✅ git add의 다양한 옵션을 상황에 맞게 사용할 수 있습니다
- ✅ 좋은 커밋 메시지를 작성하고 관리할 수 있습니다
- ✅ 커밋을 되돌리고 수정할 수 있습니다
지난 편 복습
기초편 #7에서는 첫 커밋과 관리를 배웠습니다:
- Git의 3가지 영역 (Working Directory, Staging Area, Repository)
- 파일 스테이징하고 커밋 만들기
- 효과적인 커밋 메시지 작성법
- 커밋 히스토리 조회 및 관리
1. Git의 작업 흐름 이해하기
Git의 3단계 작업 영역
Git은 파일의 변경사항을 3단계 영역으로 관리합니다:
📋 작업 흐름
- 📁 Working Directory (작업 공간)
- 실제 파일을 수정하는 공간
- 상태: Untracked, Modified
- 📦 Staging Area (준비 영역)
- 커밋할 변경사항을 준비하는 공간
- 명령어:
git add로 이동
- 💾 Local Repository (로컬 저장소)
- 커밋된 변경사항이 저장되는 공간
- 명령어:
git commit으로 저장
- ☁️ Remote Repository (원격 저장소)
- GitHub에 있는 공유 저장소
- 명령어:
git push로 업로드,git pull로 다운로드
🔄 작업 흐름 다이어그램 (클릭하여 펼치기)
graph LR
A[📁 Working<br/>Directory] -->|git add| B[📦 Staging<br/>Area]
B -->|git commit| C[💾 Local<br/>Repository]
C -->|git push| D[☁️ Remote<br/>Repository]
D -->|git pull| A
style A fill:#fff3e0,stroke:#e65100,stroke-width:2px
style B fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
style C fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px
style D fill:#e1f5fe,stroke:#01579b,stroke-width:2px
각 영역의 특징
| 영역 | 역할 | 상태 | 주요 명령어 |
|---|---|---|---|
| Working Directory | 실제 작업 공간 | • 파일 수정/생성/삭제 • Untracked/Modified | git statusgit diff |
| Staging Area | 커밋 준비 영역 | • 커밋할 변경사항 준비 • Staged | git addgit reset |
| Local Repository | 로컬 저장소 | • 커밋 히스토리 저장 • Committed | git commitgit log |
| Remote Repository | 원격 저장소 | • 팀 공유 저장소 • Pushed | git pushgit pull |
2. git add - 변경사항 준비하기 (⭐ 초보자 필수)
git add는 변경된 파일을 Staging Area로 옮기는 명령어입니다.
초보자는 이것만 알아도 충분합니다!
1
2
3
4
5
6
7
8
# 1. 모든 변경사항 추가 (가장 많이 사용)
git add .
# 2. 특정 파일만 추가
git add filename.txt
# 3. 여러 파일 추가
git add file1.txt file2.txt
이것만 알아도 90%는 해결됩니다! ✅
실전 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 1. 파일 생성
echo "Hello, Git!" > hello.txt
echo "console.log('Hello');" > app.js
# 2. 상태 확인
git status
# Output:
# Untracked files:
# hello.txt
# app.js
# 3. 파일 추가
git add hello.txt
git status
# Output:
# Changes to be committed:
# new file: hello.txt
# Untracked files:
# app.js
# 4. 모든 파일 추가
git add .
git status
# Output:
# Changes to be committed:
# new file: hello.txt
# new file: app.js
🚀 고급 옵션 (나중에 배워도 됩니다)
git add 명령어 옵션 비교
| 명령어 | 설명 | 사용 시나리오 |
|---|---|---|
git add <file> | 특정 파일만 추가 | 선택적으로 커밋하고 싶을 때 |
git add . | 현재 디렉토리의 모든 변경사항 | 모든 변경사항을 커밋할 때 |
git add -A | 전체 저장소의 모든 변경사항 | 프로젝트 전체 변경사항 추가 |
git add -u | 수정/삭제된 파일만 (새 파일 제외) | 기존 파일 변경사항만 추가 |
git add -p | 대화형으로 일부분만 추가 | 세밀한 커밋 관리 |
git add *.js | 특정 패턴의 파일들 | 특정 타입 파일만 추가 |
🔄 git add 작동 과정
flowchart LR
A[파일 수정] --> B[git add]
B --> C[Staging Area]
C --> D[git status]
D --> E{확인}
E -->|✅| F[commit 준비]
E -->|❌| G[git reset]
G --> B
style A fill:#fff3e0,stroke:#e65100,stroke-width:2px
style F fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
style G fill:#ffcdd2,stroke:#c62828,stroke-width:2px
💡 팁: 파일 일부만 추가하기
1
2
3
4
5
6
7
8
9
10
# 파일의 일부분만 추가
git add -p filename.txt
# 대화형 옵션:
y - 이 부분 추가
n - 이 부분 건너뛰기
s - 더 작은 단위로 나누기
e - 수동으로 편집
q - 종료
? - 도움말
⚠️ git add 실수 방지 팁
1
2
3
4
5
6
7
8
# .gitignore를 먼저 설정하고 확인
git status --ignored
# 추가할 파일 미리보기 (dry run)
git add -n .
# 실수로 추가한 파일 제거
git rm --cached <file>
3. git commit - 변경사항 저장하기
git commit은 Staging Area의 파일들을 Repository에 저장합니다.
기본 사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 커밋 메시지와 함께 커밋
git commit -m "커밋 메시지"
# 에디터를 열어서 긴 메시지 작성
git commit
# 스테이징 없이 변경된 파일 모두 커밋
git commit -a -m "커밋 메시지"
# 이전 커밋 수정
git commit --amend
# 빈 커밋 만들기
git commit --allow-empty -m "빈 커밋"
좋은 커밋 메시지 작성법
📝 커밋 메시지 구조
좋은 커밋 메시지는 명확한 구조를 가집니다:
📦 커밋 메시지 형식:
1
2
3
4
5
<type>(<scope>): <subject>
빈 줄
<body>
빈 줄
<footer>
구성 요소:
- 제목 라인:
type(scope): subject(50자 이내) - 본문: 상세 설명, 무엇을 왜 했는지 (72자 줄바꿈)
- 꼬리말: 이슈 번호, Breaking Changes 등
한국 개발팀을 위한 커밋 메시지 가이드
1
2
3
4
5
6
7
8
9
10
11
12
13
한글 vs 영어:
규칙: "영어 사용 권장 (오픈소스 프로젝트)"
예외: "팀 내부 프로젝트는 한글 허용"
좋은 예시:
- "feat: add user authentication with JWT"
- "fix: resolve null pointer exception in login"
- "docs: update API documentation for v2.0"
피해야 할 예시:
- "update" (너무 모호함)
- "bug fix" (type 사용 안 함)
- "WIP" (미완성 커밋)
커밋 타입별 가이드
| 타입 | 설명 | 예시 |
|---|---|---|
| feat | 새로운 기능 추가 | feat: 사용자 프로필 이미지 업로드 기능 추가 |
| fix | 버그 수정 | fix: 로그인 시 null 포인터 예외 수정 |
| docs | 문서 수정 | docs: API 사용 가이드 추가 |
| style | 코드 포맷팅, 세미콜론 누락 등 | style: ESLint 규칙에 맞게 코드 정리 |
| refactor | 코드 리팩토링 | refactor: 사용자 인증 로직 서비스 레이어로 분리 |
| test | 테스트 코드 추가/수정 | test: 회원가입 통합 테스트 추가 |
| chore | 빌드 업무, 패키지 매니저 설정 등 | chore: webpack 설정 업데이트 |
| perf | 성능 개선 | perf: 이미지 레이지 로딩 구현 |
📦 좋은 커밋 메시지 예시
💬 완전한 커밋 메시지 형식 (클릭하여 펴기)
1
2
3
4
5
6
7
8
9
# 완전한 형식
git commit -m "feat(auth): JWT 기반 인증 시스템 구현
- Access Token과 Refresh Token 구조 구현
- 토큰 만료 시 자동 갱신 로직 추가
- 인증 실패 시 에러 핸들링 개선
Breaking Change: 기존 세션 기반 인증 제거
Closes #123, #124"
커밋 되돌리기 (⚠️ 주의 필요)
안전한 방법 (초보자 권장)
1
2
# 커밋만 취소, 파일은 그대로
git reset --soft HEAD~1
위험도별 옵션
| 옵션 | 위험도 | 설명 | 복구 가능? |
|---|---|---|---|
--soft | 🟢 안전 | 커밋만 취소, 파일 그대로 | ✅ |
--mixed | 🟡 보통 | 커밋과 스테이징 취소 | ✅ |
--hard | 🔴 위험! | 모든 변경사항 영구 삭제 | ❌ |
⚠️ 경고:
git reset --hard는 복구 불가능합니다! 확실할 때만 사용하세요. 초보자는 사용하지 마세요!
사용 예제
1
2
3
4
5
6
7
8
9
10
11
# 🟢 안전: 마지막 커밋 취소 (파일은 그대로)
git reset --soft HEAD~1
# 🟡 보통: 마지막 커밋 취소 (파일도 unstaged 상태로)
git reset HEAD~1
# 🔴 위험: 마지막 커밋 완전히 취소 (파일 변경사항도 삭제)
git reset --hard HEAD~1
# 🔴 위험: 특정 커밋으로 되돌리기
git reset --hard <commit-hash>
❓ 실수로 --hard를 사용했다면? (클릭하여 펼치기)
매우 제한적으로 복구 가능:
1
2
3
4
5
# reflog로 이전 상태 찾기
git reflog
# 특정 커밋으로 복구
git reset --hard HEAD@{1}
하지만 스테이징되지 않은 변경사항은 영구 손실됩니다!
자주 묻는 질문 (FAQ)
Q1. git add .과 git add -A의 차이는?
A:
git add .: 현재 디렉토리의 모든 변경사항 추가git add -A: 전체 프로젝트의 모든 변경사항 추가
실전에서는 프로젝트 루트에서 작업할 때 둘의 차이가 없습니다.
Q2. 실수로 git add를 했어요. 어떻게 되돌리나요?
A:
1
2
3
4
5
6
7
8
# 특정 파일 언스테이징
git reset HEAD filename
# 또는 (Git 2.23+)
git restore --staged filename
# 모든 파일 언스테이징
git reset HEAD .
Q3. git commit –amend는 언제 사용하나요?
A: 마지막 커밋을 수정하고 싶을 때:
- 커밋 메시지 오타 수정
- 빠뜨린 파일 추가
- 작은 수정사항 추가
⚠️ 주의: 이미 push한 커밋은 수정하지 마세요!
Q4. 커밋 메시지를 한글로 써도 되나요?
A:
- 오픈소스 프로젝트: 영어 사용 권장
- 회사/팀 내부 프로젝트: 팀 규칙 따르기
- 개인 프로젝트: 자유롭게 선택
가장 중요한 것은 일관성과 명확성입니다.
실습 과제
과제 1: git add 연습
- 3개 파일 생성:
file1.txt,file2.txt,file3.txt file1.txt만 스테이징git status로 확인- 나머지 파일 모두 스테이징
- 다시
git status확인
과제 2: 선택적 커밋
- 5개 파일 수정
- 관련된 변경사항끼리 묶어서 2개의 커밋 생성
git log --oneline으로 확인
과제 3: 커밋 메시지 연습
Conventional Commits 형식으로 다음 시나리오의 커밋 메시지 작성:
- 로그인 기능 추가
- 로그인 버그 수정
- README 파일 업데이트
- 코드 정리 (기능 변경 없음)
과제 4: git add -p 실습
- 파일 하나에 3가지 다른 변경사항 추가
git add -p로 일부만 선택적으로 스테이징- 관련된 변경사항끼리 묶어서 커밋
마무리
축하합니다! git add와 commit의 핵심을 마스터했습니다.
핵심 요약:
- ✅ git add: 변경사항을 Staging Area로 이동
- ✅ git commit: 스냅샷을 Repository에 저장
- ✅ 좋은 커밋 메시지: type(scope): subject 형식
- ✅ 커밋 되돌리기: reset 옵션 (–soft, –mixed, –hard)
다음 편에서는 git push와 pull로 원격 저장소와 동기화하는 방법을 배워보겠습니다!
📚 GitHub 마스터하기 시리즈
🌱 기초편 (입문자)
- GitHub 소개와 계정 만들기
- 프로필 꾸미기와 포트폴리오
- 보안 설정과 인증
- Repository 이해하기
- README 작성법
- .gitignore와 라이선스
- 첫 커밋과 관리
- git add와 commit 👉 현재 글
- git push와 pull
- 실전 워크플로우
- Branch 기본
- Merge와 Rebase
- 브랜치 전략
- Fork와 Clone
- Pull Request
💼 실전편 (중급자)
🚀 고급편 (전문가)
- GitHub Actions 입문
- Actions 고급 활용
- Webhooks와 API
- GitHub Apps 개발
- 보안 기능 활용
- Packages 레지스트리
- Codespaces 클라우드 개발
- GitHub CLI 마스터
- Insights와 Analytics
🏆 심화편 (전문가+)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
