안녕하세요, 성장하는 개발자 여러분!
“개발은 혼자 하는 것이 아니다” 🤝
처음 회사에 입사했을 때, 저는 Git을 단순히 “코드 백업 도구” 정도로만 생각했습니다. 하지만 실제 팀 프로젝트에 참여하면서 깨달았죠. Git과 GitHub는 단순한 도구가 아니라 팀워크의 핵심이라는 것을!
오늘은 제가 실무에서 겪은 다양한 상황들을 통해 배운 Git과 GitHub 협업의 모든 것을 정리해 드리겠습니다. 더 이상 “merge conflict가 무서워서 push를 못하겠어요” 라는 말은 하지 마세요! 😅
1. Git의 진짜 존재 이유: 혼자가 아닌 함께
왜 Git을 배워야 할까?
# 개발자의 하루 일과
09:00 - 어제 작업한 코드 확인
09:30 - 동료가 수정한 코드와 합치기
10:00 - 새로운 기능 개발 시작
12:00 - 점심 전 임시 저장
14:00 - 버그 발견! 이전 버전으로 되돌리기
16:00 - 팀원과 코드 리뷰하기
18:00 - 최종 버전 배포 준비
# 이 모든 과정에서 Git이 필요합니다!
Git vs 다른 백업 방법들
# 😱 끔찍한 과거의 방법들
프로젝트_최종.zip
프로젝트_최종_진짜최종.zip
프로젝트_최종_진짜최종_수정.zip
프로젝트_최종_진짜최종_수정_220714.zip
# 😎 Git으로 깔끔하게
git log --oneline
a1b2c3d 버그 수정
e4f5g6h 새로운 기능 추가
i7j8k9l 코드 리팩토링
m0n1o2p 프로젝트 초기 설정
2. Git 기본 명령어: 실무에서 자주 쓰는 것만 골라서
프로젝트 시작하기
# 새 프로젝트 시작
git init
git add README.md
git commit -m "Initial commit" # 관례적으로 첫 커밋 메시지
# 기존 프로젝트 가져오기
git clone https://github.com/company/awesome-project.git
cd awesome-project
일상적인 작업 흐름
# 1. 현재 상태 확인 (하루에 수십 번 사용)
git status
# 2. 변경사항 확인
git diff # 아직 add 안 한 변경사항
git diff --staged # add 한 변경사항
git diff HEAD~1 # 이전 커밋과 비교
# 3. 파일 추가 (선택적으로)
git add src/components/Button.js # 특정 파일만
git add src/components/ # 특정 폴더만
git add . # 모든 변경사항 (신중하게!)
# 4. 커밋하기
git commit -m "Add user authentication feature"
# 5. 한 번에 add + commit (이미 추적 중인 파일만)
git commit -am "Fix typo in user profile"
실수했을 때 되돌리기
# 아직 커밋 안 한 변경사항 되돌리기
git checkout -- filename.js # 특정 파일
git checkout -- . # 모든 파일
# 커밋 메시지 수정 (마지막 커밋만)
git commit --amend -m "정정된 커밋 메시지"
# 커밋 되돌리기 (3가지 방법)
git reset --soft HEAD~1 # 커밋만 취소, 파일은 staged 상태 유지
git reset --mixed HEAD~1 # 커밋 취소, 파일은 unstaged 상태 (기본값)
git reset --hard HEAD~1 # 커밋 취소, 파일 변경사항도 모두 삭제 (주의!)
# 안전한 되돌리기 (이력 남김)
git revert a1b2c3d # 특정 커밋의 변경사항을 되돌리는 새 커밋 생성
.gitignore 활용법
# .gitignore 파일 예시
# 운영체제 파일
.DS_Store
Thumbs.db
# IDE 설정 파일
.vscode/
.idea/
*.swp
*.swo
# 의존성 파일
node_modules/
__pycache__/
*.pyc
# 빌드 결과물
dist/
build/
*.min.js
# 환경 설정 파일 (보안 중요!)
.env
.env.local
config/database.yml
# 로그 파일
*.log
logs/
# 임시 파일
tmp/
temp/
중요한 팁: .gitignore는 아직 Git이 추적하지 않는 파일에만 적용됩니다!
# 이미 커밋된 파일을 .gitignore에 추가했다면
git rm --cached 파일명 # Git 추적에서만 제거 (파일은 유지)
git rm -r --cached 폴더명 # 폴더 전체 추적 제거
git commit -m "Remove tracked files from .gitignore"
3. 브랜치 전략: 혼자서도 쓰고, 팀에서도 쓰는
브랜치의 기본 개념
# 브랜치 확인
git branch # 로컬 브랜치 목록
git branch -r # 원격 브랜치 목록
git branch -a # 모든 브랜치 목록
# 브랜치 생성 및 이동
git branch feature/user-auth # 브랜치 생성
git checkout feature/user-auth # 브랜치 이동
git checkout -b feature/user-auth # 생성과 이동을 한 번에
# 최신 Git에서는 switch 사용 권장
git switch feature/user-auth # 브랜치 이동
git switch -c feature/user-auth # 생성과 이동을 한 번에
Git Flow 브랜치 전략 (대부분의 회사에서 사용)
# 브랜치 구조
main (master) ← 배포용 (항상 안정적)
↓
develop ← 개발 메인 브랜치
↓
feature/* ← 새 기능 개발
hotfix/* ← 긴급 버그 수정
release/* ← 배포 준비
# 실제 작업 흐름
# 1. 새 기능 개발 시작
git checkout develop
git pull origin develop
git checkout -b feature/user-login
# 2. 개발 완료 후 develop에 합치기
git checkout develop
git pull origin develop # 최신 상태로 업데이트
git merge feature/user-login
git push origin develop
git branch -d feature/user-login # 로컬 브랜치 삭제
GitHub Flow (간단한 프로젝트용)
# 더 간단한 전략
main ← 배포용
feature/* ← 모든 작업용 브랜치
# 작업 흐름
git checkout main
git pull origin main
git checkout -b fix/payment-bug
# ... 작업 ...
git push origin fix/payment-bug
# GitHub에서 Pull Request 생성
4. 원격 저장소 관리: GitHub과 친해지기
원격 저장소 연결
# 원격 저장소 추가
git remote add origin https://github.com/username/project.git
# 여러 원격 저장소 관리
git remote add origin https://github.com/company/project.git
git remote add fork https://github.com/myname/project.git
# 원격 저장소 확인
git remote -v
# 원격 저장소 URL 변경
git remote set-url origin https://github.com/newurl/project.git
push와 pull의 실전 활용
# 기본적인 push/pull
git push origin main
git pull origin main
# 새 브랜치 첫 push (upstream 설정)
git push -u origin feature/new-feature
# 이후로는 git push만 해도 됨
# force push (조심해서 사용!)
git push --force-with-lease origin main # 더 안전한 방법
git push -f origin main # 위험한 방법
# fetch vs pull
git fetch origin # 원격 변경사항만 가져오기 (로컬 파일 안 건드림)
git pull origin main # fetch + merge를 한 번에
충돌 해결하기 (Conflict Resolution)
# merge 중 충돌 발생 시
git merge feature/user-auth
# Auto-merging src/auth.js
# CONFLICT (content): Merge conflict in src/auth.js
# Automatic merge failed; fix conflicts and then commit the result.
# 충돌 파일 확인
git status
# Unmerged paths:
# both modified: src/auth.js
# 충돌 해결 후
git add src/auth.js
git commit -m "Resolve merge conflict in auth.js"
충돌이 발생한 파일을 열면 이런 식으로 표시됩니다:
function authenticateUser(username, password) {
<<<<<<< HEAD
// 현재 브랜치의 코드
return bcrypt.compare(password, user.hashedPassword);
=======
// 합치려는 브랜치의 코드
return crypto.compare(password, user.encryptedPassword);
>>>>>>> feature/user-auth
}
수동으로 편집해서 올바른 코드를 남기고 <<<<<<<, =======, >>>>>>> 표시를 삭제합니다.
5. GitHub 협업 워크플로우: Pull Request부터 Code Review까지
Pull Request (PR) 만들기
# 1. 브랜치에서 작업 완료
git checkout -b feature/add-shopping-cart
# ... 개발 작업 ...
git add .
git commit -m "Add shopping cart functionality"
git push origin feature/add-shopping-cart
# 2. GitHub에서 Pull Request 생성
# - base: main, compare: feature/add-shopping-cart
# - 제목: Add shopping cart functionality
# - 설명: 장바구니 기능을 추가했습니다. 상품 추가/삭제/수량 변경이 가능합니다.
좋은 PR 만들기
## PR 템플릿 예시
### 🎯 작업 내용
- [ ] 장바구니 상품 추가 기능
- [ ] 장바구니 상품 삭제 기능
- [ ] 상품 수량 변경 기능
- [ ] 장바구니 총액 계산
### 🧪 테스트
- [ ] 단위 테스트 추가
- [ ] 통합 테스트 확인
- [ ] 수동 테스트 완료
### 📸 스크린샷
(UI 변경사항이 있다면 스크린샷 첨부)
### 🔗 관련 이슈
Closes #123
### 📝 리뷰어에게
장바구니 성능 최적화 부분을 특히 검토해 주세요.
Code Review 받고 주기
# 리뷰 반영 후 추가 커밋
git add .
git commit -m "Apply code review suggestions"
git push origin feature/add-shopping-cart
# PR이 승인되고 merge 후 정리
git checkout main
git pull origin main
git branch -d feature/add-shopping-cart # 로컬 브랜치 삭제
리뷰 받을 때의 마음가짐:
- 비판이 아닌 성장의 기회로 받아들이기
- 질문하기를 두려워하지 말기
- “왜 이렇게 했나요?”에 당황하지 말고 설명하기
리뷰 줄 때의 원칙:
- 코드에 대한 의견, 사람에 대한 공격 금지
- “이렇게 하면 어떨까요?” 식의 제안
- 칭찬도 적극적으로 해주기
6. 실무에서 자주 마주치는 상황들과 해결법
상황 1: “어? 내 코드가 사라졌어요!”
# 원인: 잘못된 merge나 reset
# 해결: reflog 활용
git reflog # 모든 작업 이력 확인
git checkout HEAD@{3} # 3단계 전으로 되돌아가기
git checkout -b recovery # 복구용 브랜치 생성
상황 2: “커밋 메시지를 잘못 적었어요!”
# 마지막 커밋 메시지 수정
git commit --amend -m "올바른 커밋 메시지"
# 이미 push한 경우 (팀원과 상의 후)
git push --force-with-lease origin feature-branch
상황 3: “잘못된 브랜치에 커밋했어요!”
# 현재 브랜치에서 커밋을 다른 브랜치로 옮기기
git checkout correct-branch
git cherry-pick a1b2c3d # 특정 커밋만 가져오기
# 원래 브랜치에서 커밋 제거
git checkout wrong-branch
git reset --hard HEAD~1
상황 4: “큰 파일을 실수로 커밋했어요!”
# Git에서 파일 이력까지 완전 삭제
git filter-branch --force --index-filter
'git rm --cached --ignore-unmatch path/to/large-file'
--prune-empty --tag-name-filter cat -- --all
# 더 쉬운 방법: BFG Repo-Cleaner 사용
java -jar bfg.jar --delete-files large-file.zip
git reflog expire --expire=now --all && git gc --prune=now --aggressive
상황 5: “동료와 같은 파일을 수정했어요!”
# 충돌 최소화 전략
# 1. 자주 pull 받기
git pull origin develop
# 2. 작은 단위로 커밋하기
git add specific-file.js
git commit -m "Add validation for email field"
# 3. rebase 사용하기 (히스토리를 깔끔하게)
git pull --rebase origin develop
7. 고급 Git 기능: 실무에서 빛나는 도구들
Stash: 임시 저장의 마법
# 작업 중 급한 버그 수정 요청이 들어왔을 때
git stash # 현재 작업 임시 저장
git stash save "WIP: user profile UI" # 메시지와 함께 저장
git checkout hotfix/critical-bug
# ... 버그 수정 ...
git checkout feature/user-profile
git stash list # 저장된 stash 목록
git stash pop # 가장 최근 stash 적용 후 삭제
git stash apply stash@{1} # 특정 stash 적용 (유지)
git stash drop stash@{1} # 특정 stash 삭제
Cherry-pick: 선택적 커밋 가져오기
# 다른 브랜치의 특정 커밋만 가져오기
git log --oneline feature/payment # 커밋 해시 확인
git cherry-pick e4f5g6h # 특정 커밋만 현재 브랜치에 적용
# 여러 커밋을 한 번에
git cherry-pick e4f5g6h i7j8k9l m0n1o2p
Interactive Rebase: 커밋 이력 정리
# 최근 3개 커밋 수정
git rebase -i HEAD~3
# 에디터에서 수행할 수 있는 작업들:
# pick: 커밋 그대로 유지
# edit: 커밋 메시지나 내용 수정
# squash: 이전 커밋과 합치기
# drop: 커밋 삭제
# reorder: 순서 바꾸기 (줄 순서 변경)
Bisect: 버그 찾기
# 언제부터 버그가 시작됐는지 이진 검색으로 찾기
git bisect start
git bisect bad # 현재 버전은 버그 있음
git bisect good v1.0.0 # v1.0.0은 정상 작동
# Git이 중간 지점으로 이동시켜 줌
# 테스트 후 결과 입력
git bisect good # 이 버전은 정상
# 또는
git bisect bad # 이 버전도 버그 있음
# 반복하면 버그가 시작된 커밋을 찾아줌
git bisect reset # 원래 위치로 돌아가기
8. GitHub 고급 기능: 프로젝트 관리부터 자동화까지
Issues와 Project 관리
## Issue 템플릿 예시
### 🐛 버그 리포트
**증상**
로그인 후 프로필 페이지가 로딩되지 않음
**재현 방법**
1. 메인 페이지에서 로그인
2. 프로필 메뉴 클릭
3. 빈 화면 표시
**예상 결과**
사용자 프로필 정보가 표시되어야 함
**실제 결과**
빈 화면이 표시됨
**환경**
- OS: macOS Monterey
- Browser: Chrome 103.0.5060.134
- Device: MacBook Pro 2021
**추가 정보**
브라우저 콘솔에 API 오류 메시지 출력
GitHub Actions로 자동화
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "18"
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Run linting
run: npm run lint
- name: Build project
run: npm run build
Security 기능 활용
# 의존성 보안 취약점 확인
npm audit
npm audit fix
# GitHub에서 자동으로 보안 취약점 알림
# Settings > Security & analysis 에서 설정
# - Dependency graph
# - Dependabot alerts
# - Dependabot security updates
9. 팀 협업을 위한 Git 컨벤션
커밋 메시지 컨벤션
# Conventional Commits 형식
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
# 예시들
feat: add user authentication
fix: resolve login redirect issue
docs: update API documentation
style: fix code formatting
refactor: improve database query performance
test: add unit tests for user service
chore: update dependency versions
# 더 구체적인 예시
feat(auth): implement OAuth 2.0 login
fix(payment): handle null pointer in payment processing
docs(readme): add installation instructions
브랜치 네이밍 컨벤션
# 기능 개발
feature/user-authentication
feature/shopping-cart
feature/payment-integration
# 버그 수정
fix/login-redirect-issue
fix/payment-validation-error
hotfix/critical-security-patch
# 개선 작업
improve/database-performance
refactor/user-service
chore/update-dependencies
# 실험적 기능
experiment/new-ui-design
spike/graphql-integration
코드 리뷰 가이드라인
## 리뷰 체크리스트
### 기능성
- [ ] 요구사항을 충족하는가?
- [ ] 엣지 케이스가 처리되었는가?
- [ ] 에러 핸들링이 적절한가?
### 코드 품질
- [ ] 코드가 읽기 쉬운가?
- [ ] 네이밍이 명확한가?
- [ ] 중복 코드가 없는가?
- [ ] 함수가 한 가지 역할만 하는가?
### 성능
- [ ] 불필요한 리렌더링이 없는가?
- [ ] 메모리 누수 가능성은 없는가?
- [ ] 데이터베이스 쿼리가 효율적인가?
### 보안
- [ ] 사용자 입력 검증이 되어있는가?
- [ ] 민감한 정보가 노출되지 않는가?
- [ ] 인증/인가가 적절히 구현되었는가?
10. 실무 시나리오: 하루 일과로 보는 Git 활용
오전 9시: 출근 후 상황 파악
# 1. 최신 상태 확인
git status
git pull origin develop
# 2. 어제 작업 내용 확인
git log --oneline -10
git diff HEAD~1
# 3. 오늘 할 일 확인
git branch -a
git checkout feature/user-dashboard
오전 10시: 새로운 기능 개발 시작
# 1. 새 브랜치 생성
git checkout develop
git pull origin develop
git checkout -b feature/email-notifications
# 2. 첫 번째 작업 커밋
# ... 코딩 ...
git add src/services/email.js
git commit -m "feat: add email service basic structure"
# 3. 중간 저장 (점심 전)
git add .
git commit -m "wip: implement email template system"
git push origin feature/email-notifications
오후 2시: 코드 리뷰 요청 들어옴
# 1. 현재 작업 임시 저장
git stash save "WIP: email notification templates"
# 2. 리뷰할 브랜치로 이동
git checkout feature/user-profile-update
git pull origin feature/user-profile-update
# 3. 코드 확인
git log --oneline -5
git diff develop..feature/user-profile-update
# 4. 로컬에서 테스트
npm test
npm run lint
# 5. GitHub에서 리뷰 작성 후 원래 작업으로 복귀
git checkout feature/email-notifications
git stash pop
오후 4시: 긴급 버그 수정 요청
# 1. 현재 작업 저장
git add .
git commit -m "wip: email notification progress save"
# 2. 핫픽스 브랜치 생성
git checkout main
git pull origin main
git checkout -b hotfix/payment-error
# 3. 버그 수정
# ... 코딩 ...
git add .
git commit -m "fix: resolve payment processing timeout issue"
# 4. 테스트 후 push
npm test
git push origin hotfix/payment-error
# 5. 즉시 PR 생성 및 빠른 리뷰 요청
오후 6시: 하루 마무리
# 1. 작업 내용 정리
git add .
git commit -m "feat: complete email notification system
- Add email template engine
- Implement notification queue
- Add email delivery tracking
- Add unit tests"
# 2. 원격에 push
git push origin feature/email-notifications
# 3. PR 생성 준비
git log --oneline feature/email-notifications ^develop
# 4. 내일을 위한 메모
echo "TODO: Add integration tests for email system" > TODO.md
git add TODO.md
git commit -m "docs: add TODO for tomorrow"
11. 자주 하는 실수와 예방법
실수 1: “git add .” 남용
# ❌ 나쁜 습관
git add .
git commit -m "fix stuff"
# ✅ 좋은 습관
git add src/components/Button.js
git add tests/button.test.js
git commit -m "fix: resolve button click event handler"
git add README.md
git commit -m "docs: update installation instructions"
실수 2: 의미 없는 커밋 메시지
# ❌ 나쁜 예시들
git commit -m "fix"
git commit -m "update"
git commit -m "changes"
git commit -m "asdf"
git commit -m "work in progress"
# ✅ 좋은 예시들
git commit -m "fix: resolve null pointer exception in user service"
git commit -m "feat: add password strength validation"
git commit -m "refactor: extract common utility functions"
git commit -m "test: add integration tests for payment flow"
실수 3: merge vs rebase 혼동
# merge: 브랜치 히스토리 보존 (협업 시 안전)
git checkout main
git merge feature/user-auth
# rebase: 깔끔한 히스토리 (개인 브랜치에서만)
git checkout feature/user-auth
git rebase main
# ⚠️ 주의: 이미 push한 브랜치는 rebase 금지!
실수 4: 큰 파일 커밋
# 예방: .gitignore에 미리 추가
*.log
*.tmp
node_modules/
.env
dist/
build/
# Git LFS 사용 (큰 바이너리 파일용)
git lfs track "*.psd"
git add .gitattributes
git add design.psd
git commit -m "add design file with LFS"
12. 도구와 설정으로 생산성 높이기
Git 설정 최적화
# 기본 설정
git config --global user.name "김개발"
git config --global user.email "dev@company.com"
# 편의 설정
git config --global init.defaultBranch main
git config --global core.autocrlf input # Windows에서는 true
git config --global core.editor "code --wait" # VS Code 사용
# 유용한 별칭들
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.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'
# 로그 예쁘게 보기
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
VS Code와 Git 연동
// settings.json
{
"git.autofetch": true,
"git.confirmSync": false,
"git.enableSmartCommit": true,
"diffEditor.ignoreTrimWhitespace": false,
"merge-conflict.autoNavigateNextConflict.enabled": true
}
유용한 Git GUI 도구들
# 터미널에서 시각적으로
git log --graph --oneline --all
git log --graph --pretty=format:'%h -%d %s (%cr) <%an>' --abbrev-commit --all
# GUI 도구들
- GitHub Desktop (초보자 추천)
- SourceTree (무료, 강력한 기능)
- GitKraken (유료, 예쁜 UI)
- VS Code Git Graph 확장 (개발 중 편리)
마치며: Git 마스터가 되는 여정
단계별 학습 로드맵
초급 (1-2개월):
- [x] 기본 명령어 (add, commit, push, pull)
- [x] 브랜치 생성과 이동
- [x] GitHub 기본 사용법
- [x] .gitignore 작성
중급 (3-6개월):
- [x] merge와 rebase 차이점 이해
- [x] 충돌 해결하기
- [x] Pull Request 워크플로우
- [x] stash, cherry-pick 활용
고급 (6개월+):
- [x] interactive rebase로 히스토리 정리
- [x] GitHub Actions으로 자동화
- [x] Git hooks 활용
- [x] 복잡한 브랜치 전략 설계
매일 연습할 수 있는 것들
# 매일 아침 루틴
git status
git pull origin develop
git log --oneline -5
# 작업 중 습관화할 것들
1. 작은 단위로 자주 커밋
2. 의미 있는 커밋 메시지 작성
3. 푸시 전에 한 번 더 확인
4. 동료 코드 적극적으로 리뷰하기
# 주간 정리
git log --since="1 week ago" --oneline
git branch -d <merged-branches> # 정리
마지막 조언
Git은 도구일 뿐, 협업이 목적입니다. 완벽한 Git 사용법보다는 팀원들과 원활하게 소통하고 협업하는 것이 더 중요해요.
실수를 두려워하지 마세요! Git의 가장 큰 장점은 거의 모든 것을 되돌릴 수 있다는 것입니다. 많이 시도해보고, 많이 실수해보면서 자연스럽게 익숙해질 거예요.
그리고 무엇보다, 동료에게 도움을 요청하는 것을 부끄러워하지 마세요. “이 상황에서 어떻게 해야 할지 모르겠어요”라고 말하는 것이 혼자 끙끙대는 것보다 훨씬 효율적입니다! 🤝
다음에는 “CI/CD와 자동화 배포 실전 가이드”로 개발 프로세스의 마지막 퍼즐을 맞춰보겠습니다. 기대해 주세요!