본문으로 건너뛰기

🌿 Git이란?

📖 정의

Git은 분산 버전 관리 시스템(Distributed Version Control System)입니다. 코드의 변경 이력을 추적하고 관리하며, 여러 개발자가 동시에 작업할 수 있게 해줍니다. GitHub, GitLab, Bitbucket 등은 Git 저장소를 호스팅하는 서비스로, 협업과 코드 공유를 쉽게 만들어줍니다.

🎯 비유로 이해하기

게임의 세이브 포인트

Git을 게임의 세이브 시스템에 비유하면:

  • Commit: 게임 세이브 - 현재 상태를 저장
  • Branch: 평행 세계 - 메인 스토리를 유지하면서 다른 선택 시도
  • Merge: 평행 세계 합치기 - 좋은 결과를 메인 스토리에 반영
  • Revert: 이전 세이브로 돌아가기 - 실수했을 때 복구
main (메인 스토리)
├─ Save 1: 캐릭터 생성
├─ Save 2: 첫 번째 마을 도착
├─ Save 3: 무기 구매

├─ feature-magic (마법 루트 실험) ← Branch
│ ├─ 마법 배우기
│ └─ 마법 마스터 → Merge (좋은 결과를 메인에 합침)

└─ Save 4: 최종 보스 클리어

⚙️ 작동 원리

1. Git의 3가지 영역

Working Directory (작업 디렉토리)
↓ git add
Staging Area (스테이징 영역)
↓ git commit
Repository (저장소)
↓ git push
Remote Repository (원격 저장소)

2. Git 작업 흐름

1. 파일 수정 (Working Directory)
└─ index.html 수정

2. 변경사항 스테이징 (Staging Area)
└─ git add index.html

3. 커밋 생성 (Local Repository)
└─ git commit -m "홈페이지 제목 수정"

4. 원격 저장소에 푸시 (Remote Repository)
└─ git push origin main

💡 실제 예시

기본 Git 명령어

# 1. Git 저장소 초기화
git init
# 또는 원격 저장소 복제
git clone https://github.com/username/repo.git

# 2. 상태 확인
git status
# 출력:
# On branch main
# Changes not staged for commit:
# modified: index.html
# Untracked files:
# new-file.js

# 3. 변경사항 추가
git add index.html # 특정 파일만
git add . # 모든 파일
git add *.js # 특정 패턴

# 4. 커밋 생성
git commit -m "기능: 사용자 로그인 추가"

# 빠른 커밋 (add + commit)
git commit -am "수정: 버튼 색상 변경"

# 5. 변경 이력 확인
git log
git log --oneline # 간단하게
git log --graph --all # 브랜치 그래프

# 6. 원격 저장소 연결
git remote add origin https://github.com/username/repo.git

# 7. 푸시 (업로드)
git push origin main

# 8. 풀 (다운로드)
git pull origin main

브랜치 작업

# 브랜치 확인
git branch # 로컬 브랜치
git branch -a # 모든 브랜치 (원격 포함)

# 새 브랜치 생성
git branch feature-login

# 브랜치 이동
git checkout feature-login

# 생성과 동시에 이동
git checkout -b feature-login

# 최신 방식 (Git 2.23+)
git switch feature-login
git switch -c feature-login # 생성과 동시에 이동

# 브랜치에서 작업
echo "console.log('Login');" > login.js
git add login.js
git commit -m "로그인 기능 추가"

# main 브랜치로 돌아가기
git checkout main

# 브랜치 병합
git merge feature-login

# 브랜치 삭제
git branch -d feature-login

협업 시나리오

# === 개발자 A ===
# 1. 저장소 복제
git clone https://github.com/team/project.git
cd project

# 2. 새 기능 브랜치 생성
git checkout -b feature-payment

# 3. 코드 작성 및 커밋
# ... 코드 작성 ...
git add .
git commit -m "결제 기능 구현"

# 4. 원격에 푸시
git push origin feature-payment

# 5. GitHub에서 Pull Request 생성

# === 개발자 B (리뷰어) ===
# 1. 최신 코드 가져오기
git fetch origin

# 2. PR 브랜치 확인
git checkout feature-payment

# 3. 코드 리뷰 후 승인

# === 개발자 A ===
# 4. Merge 후 브랜치 삭제
git checkout main
git pull origin main
git branch -d feature-payment

# === 개발자 C ===
# 5. 최신 코드 동기화
git checkout main
git pull origin main

실수 복구

# 1. 작업 디렉토리 변경 취소
git checkout -- index.html # 특정 파일
git checkout -- . # 모든 파일

# 2. 스테이징 취소
git reset HEAD index.html # 특정 파일
git reset HEAD . # 모든 파일

# 3. 커밋 수정 (마지막 커밋만)
git commit --amend -m "수정된 커밋 메시지"

# 4. 커밋 되돌리기
git revert HEAD # 마지막 커밋
git revert abc123 # 특정 커밋

# 5. 위험! 커밋 완전 삭제 (신중히 사용)
git reset --hard HEAD~1 # 마지막 1개 커밋 삭제
git reset --hard abc123 # 특정 커밋으로 돌아가기

# 6. 삭제된 커밋 복구
git reflog # 모든 이력 확인
git reset --hard abc123 # 복구

.gitignore 설정

# .gitignore 파일 생성
cat > .gitignore << EOF
# 환경 설정
.env
.env.local

# 의존성
node_modules/
venv/

# 빌드 결과물
dist/
build/
*.min.js

# 로그
*.log
logs/

# OS 파일
.DS_Store
Thumbs.db

# IDE
.vscode/
.idea/
*.swp
EOF

git add .gitignore
git commit -m "gitignore 추가"

🤔 자주 묻는 질문

Q1. Git과 GitHub의 차이는?

A:

Git (도구)
├─ 버전 관리 시스템 (소프트웨어)
├─ 로컬 컴퓨터에서 작동
├─ 명령줄(CLI)로 사용
└─ 무료, 오픈소스

GitHub (서비스)
├─ Git 저장소 호스팅 서비스
├─ 웹 기반 플랫폼
├─ 협업 기능 (PR, Issue, Wiki)
└─ 코드 공유 및 오픈소스

비유: Git = 워드프로세서, GitHub = 구글 문서

Q2. 커밋 메시지는 어떻게 작성하나요?

A: 명확하고 일관된 컨벤션을 따르세요:

# ✅ 좋은 커밋 메시지
git commit -m "기능: 사용자 로그인 API 추가"
git commit -m "수정: 회원가입 버튼 클릭 오류 해결"
git commit -m "리팩토링: 중복 코드 제거 및 함수 분리"
git commit -m "문서: README에 설치 가이드 추가"
git commit -m "스타일: 코드 포매팅 적용"

# ❌ 나쁜 커밋 메시지
git commit -m "수정"
git commit -m "버그 고침"
git commit -m "ㅇㅇㅇ"
git commit -m "작업중..."

# Conventional Commits 규칙
feat: 새로운 기능
fix: 버그 수정
docs: 문서 변경
style: 코드 포매팅
refactor: 코드 리팩토링
test: 테스트 추가
chore: 빌드, 설정 변경

# 예시
git commit -m "feat: 다크모드 토글 버튼 추가

- 헤더에 토글 버튼 컴포넌트 구현
- 로컬스토리지에 사용자 설정 저장
- CSS 변수로 테마 전환 구현

Closes #42"

Q3. Merge와 Rebase의 차이는?

A:

# Merge (병합)
# - 브랜치 이력을 그대로 유지
# - 병합 커밋 생성
git checkout main
git merge feature-login

결과:
A---B---C---D main
\ /
E-----F feature-login

# Rebase (재배치)
# - 브랜치를 다른 베이스로 이동
# - 선형 이력 유지
git checkout feature-login
git rebase main

결과:
A---B---C---D main
\
E'---F' feature-login

# 언제 사용?
Merge: 팀 협업, Pull Request
Rebase: 개인 브랜치 정리, 깔끔한 이력

Q4. Conflict(충돌)는 어떻게 해결하나요?

A:

# 충돌 발생
git merge feature-login
# Auto-merging index.html
# CONFLICT (content): Merge conflict in index.html

# 충돌 파일 확인
git status

# 파일 열기
cat index.html
# <<<<<<< HEAD
# <h1>메인 브랜치 제목</h1>
# =======
# <h1>기능 브랜치 제목</h1>
# >>>>>>> feature-login

# 수동으로 수정
# <h1>최종 제목</h1>

# 해결 완료 표시
git add index.html
git commit -m "Merge branch 'feature-login' - 제목 충돌 해결"

# 병합 취소 (필요시)
git merge --abort

Q5. Git 명령어를 취소하려면?

A:

# git add 취소
git reset HEAD file.js

# git commit 취소 (커밋 유지)
git reset --soft HEAD~1

# git commit 취소 (변경사항 유지)
git reset HEAD~1

# git commit 취소 (모든 것 삭제)
git reset --hard HEAD~1

# git push 취소 (위험!)
git revert HEAD
git push origin main

# 또는 (팀원과 협의 필요)
git reset --hard HEAD~1
git push -f origin main # Force push는 신중히!

🎓 다음 단계

Git을 이해했다면, 다음을 학습해보세요:

  1. Docker란? (문서 작성 예정) - 컨테이너 기반 배포
  2. TDD란? - 테스트 주도 개발
  3. 오픈소스란? - Git으로 협업하기

실습해보기

# 1. Git 설치 확인
git --version

# 2. Git 설정
git config --global user.name "Your Name"
git config --global user.email "your@email.com"

# 3. 연습 프로젝트 시작
mkdir my-project
cd my-project
git init

# 4. 첫 커밋
echo "# My Project" > README.md
git add README.md
git commit -m "Initial commit"

# 5. GitHub에 푸시
# GitHub에서 새 저장소 생성 후
git remote add origin https://github.com/username/my-project.git
git push -u origin main

# 6. 브랜치 실험
git checkout -b experiment
echo "console.log('Test');" > test.js
git add test.js
git commit -m "실험: 테스트 파일 추가"
git checkout main
git merge experiment

유용한 Git 별칭

# ~/.gitconfig 또는 ~/.zshrc 에 추가
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --graph --oneline --all"

# 사용
git st # git status
git co main # git checkout main
git lg # 예쁜 로그

🎬 마무리

Git은 현대 개발의 필수 도구입니다:

  • 버전 관리: 모든 변경 이력 추적
  • 협업: 여러 개발자가 동시 작업
  • 브랜치: 안전한 실험과 기능 개발
  • 복구: 언제든 이전 상태로 되돌리기

Git을 마스터하면 자신감 있게 코드를 관리하고 팀과 효율적으로 협업할 수 있습니다! 🌿✨