포스트

[이제와서 시작하는 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단계 영역으로 관리합니다:

📋 작업 흐름

  1. 📁 Working Directory (작업 공간)
    • 실제 파일을 수정하는 공간
    • 상태: Untracked, Modified
  2. 📦 Staging Area (준비 영역)
    • 커밋할 변경사항을 준비하는 공간
    • 명령어: git add로 이동
  3. 💾 Local Repository (로컬 저장소)
    • 커밋된 변경사항이 저장되는 공간
    • 명령어: git commit으로 저장
  4. ☁️ 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 status
git diff
Staging Area 커밋 준비 영역 • 커밋할 변경사항 준비
• Staged
git add
git reset
Local Repository 로컬 저장소 • 커밋 히스토리 저장
• Committed
git commit
git log
Remote Repository 원격 저장소 • 팀 공유 저장소
• Pushed
git push
git 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 연습

  1. 3개 파일 생성: file1.txt, file2.txt, file3.txt
  2. file1.txt만 스테이징
  3. git status로 확인
  4. 나머지 파일 모두 스테이징
  5. 다시 git status 확인

과제 2: 선택적 커밋

  1. 5개 파일 수정
  2. 관련된 변경사항끼리 묶어서 2개의 커밋 생성
  3. git log --oneline으로 확인

과제 3: 커밋 메시지 연습

Conventional Commits 형식으로 다음 시나리오의 커밋 메시지 작성:

  1. 로그인 기능 추가
  2. 로그인 버그 수정
  3. README 파일 업데이트
  4. 코드 정리 (기능 변경 없음)

과제 4: git add -p 실습

  1. 파일 하나에 3가지 다른 변경사항 추가
  2. git add -p로 일부만 선택적으로 스테이징
  3. 관련된 변경사항끼리 묶어서 커밋

마무리

축하합니다! git add와 commit의 핵심을 마스터했습니다.

핵심 요약:

  • git add: 변경사항을 Staging Area로 이동
  • git commit: 스냅샷을 Repository에 저장
  • 좋은 커밋 메시지: type(scope): subject 형식
  • 커밋 되돌리기: reset 옵션 (–soft, –mixed, –hard)

다음 편에서는 git push와 pull로 원격 저장소와 동기화하는 방법을 배워보겠습니다!

📚 GitHub 마스터하기 시리즈

🌱 기초편 (입문자)

  1. GitHub 소개와 계정 만들기
  2. 프로필 꾸미기와 포트폴리오
  3. 보안 설정과 인증
  4. Repository 이해하기
  5. README 작성법
  6. .gitignore와 라이선스
  7. 첫 커밋과 관리
  8. git add와 commit 👉 현재 글
  9. git push와 pull
  10. 실전 워크플로우
  11. Branch 기본
  12. Merge와 Rebase
  13. 브랜치 전략
  14. Fork와 Clone
  15. Pull Request

💼 실전편 (중급자)

  1. Issues 활용법
  2. Projects와 칸반보드
  3. 코드 리뷰 실전
  4. Discussions 활용
  5. 팀 협업 전략
  6. GitHub Pages 블로그

🚀 고급편 (전문가)

  1. GitHub Actions 입문
  2. Actions 고급 활용
  3. Webhooks와 API
  4. GitHub Apps 개발
  5. 보안 기능 활용
  6. Packages 레지스트리
  7. Codespaces 클라우드 개발
  8. GitHub CLI 마스터
  9. Insights와 Analytics

🏆 심화편 (전문가+)

  1. Submodules와 Subtree
  2. Git Internals 이해
  3. 브랜칭과 릴리스 전략
  4. GraphQL API 활용
  5. GitHub Copilot 마스터
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.