Git 기초 개념
Git이란?
Git은 분산형 버전 관리 시스템으로, 소스 코드의 변경 이력을 추적하고 여러 개발자 간의 협업을 지원합니다. 중앙집중식 시스템과 달리 각 개발자가 전체 저장소의 복사본을 가지고 있어 오프라인에서도 작업이 가능합니다.
Git의 주요 구성 요소
1. Repository (저장소)
- Local Repository: 개발자 로컬 머신의 Git 저장소
- Remote Repository: 서버에 있는 공유 저장소 (GitHub, GitLab 등)
2. Working Directory (작업 디렉토리)
현재 체크아웃된 브랜치의 파일들이 있는 디렉토리
3. Staging Area (스테이징 영역)
커밋할 준비가 된 변경사항들이 임시로 저장되는 영역
4. Git Directory (.git)
Git 메타데이터와 객체 데이터베이스가 저장되는 곳
Git 기본 명령어
저장소 초기화 및 복제
# 새 Git 저장소 초기화
git init
# 원격 저장소 복제
git clone https://github.com/username/repository.git
# 특정 브랜치만 복제
git clone -b develop https://github.com/username/repository.git
기본 설정
# 사용자 정보 설정 (전역)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 기본 에디터 설정
git config --global core.editor "code --wait"
# 설정 확인
git config --list
# 특정 저장소용 설정 (--global 없이)
git config user.name "Project Specific Name"
파일 추가 및 커밋
# 파일 상태 확인
git status
# 특정 파일을 스테이징 영역에 추가
git add filename.txt
# 모든 변경된 파일 추가
git add .
# 수정된 파일만 추가 (새 파일 제외)
git add -u
# 대화형 추가
git add -i
# 커밋 생성
git commit -m "커밋 메시지"
# 스테이징과 커밋을 한 번에
git commit -am "수정된 파일 커밋"
# 마지막 커밋 수정
git commit --amend -m "수정된 커밋 메시지"
변경사항 확인
# 작업 디렉토리와 스테이징 영역 비교
git diff
# 스테이징 영역과 마지막 커밋 비교
git diff --staged
# 특정 파일의 변경사항
git diff filename.txt
# 두 커밋 간 비교
git diff commit1 commit2
# 브랜치 간 비교
git diff branch1..branch2
히스토리 조회
# 커밋 로그 조회
git log
# 한 줄로 간단히
git log --oneline
# 그래프로 브랜치 시각화
git log --graph --oneline --all
# 특정 파일의 히스토리
git log filename.txt
# 특정 작성자의 커밋
git log --author="author-name"
# 날짜 범위로 필터링
git log --since="2024-01-01" --until="2024-12-31"
# 특정 커밋의 상세 정보
git show commit-hash
브랜치 관리
브랜치 기본 작업
# 브랜치 목록 조회
git branch
# 원격 브랜치 포함 모든 브랜치
git branch -a
# 새 브랜치 생성
git branch feature-login
# 브랜치 생성과 동시에 전환
git checkout -b feature-payment
# 또는 (Git 2.23+)
git switch -c feature-payment
# 브랜치 전환
git checkout main
git switch main
# 브랜치 삭제
git branch -d feature-completed
# 강제 삭제 (병합되지 않은 브랜치)
git branch -D feature-abandoned
# 원격 브랜치 삭제
git push origin --delete feature-old
브랜치 병합
# Fast-forward 병합
git checkout main
git merge feature-branch
# 병합 커밋 생성 (--no-ff)
git merge --no-ff feature-branch
# 스쿼시 병합 (여러 커밋을 하나로)
git merge --squash feature-branch
git commit -m "Feature: 로그인 기능 추가"
리베이스 (Rebase)
# 현재 브랜치를 main 브랜치 위로 재배치
git rebase main
# 대화형 리베이스 (커밋 편집)
git rebase -i HEAD~3
# 충돌 해결 후 리베이스 계속
git rebase --continue
# 리베이스 중단
git rebase --abort
원격 저장소 작업
원격 저장소 관리
# 원격 저장소 추가
git remote add origin https://github.com/username/repo.git
# 원격 저장소 목록
git remote -v
# 원격 저장소 정보 상세 조회
git remote show origin
# 원격 저장소 URL 변경
git remote set-url origin https://github.com/username/new-repo.git
# 원격 저장소 제거
git remote remove origin
Push와 Pull
# 원격 저장소로 푸시
git push origin main
# 첫 푸시 시 업스트림 설정
git push -u origin main
# 모든 브랜치 푸시
git push --all origin
# 태그 푸시
git push --tags
# 원격 저장소에서 가져오기 (병합하지 않음)
git fetch origin
# 가져오기와 병합
git pull origin main
# 리베이스로 pull
git pull --rebase origin main
협업 워크플로우
Git Flow
Git Flow는 Vincent Driessen이 제안한 브랜치 모델로, 대규모 프로젝트에 적합합니다.
브랜치 구조
- main/master: 프로덕션 배포용 브랜치
- develop: 개발 통합 브랜치
- feature/*: 기능 개발 브랜치
- release/*: 릴리스 준비 브랜치
- hotfix/*: 긴급 수정 브랜치
워크플로우 예시
# Git Flow 초기화
git flow init
# 새 기능 브랜치 시작
git flow feature start login-system
# 기능 개발 완료 후 종료
git flow feature finish login-system
# 릴리스 브랜치 시작
git flow release start 1.0.0
# 릴리스 완료
git flow release finish 1.0.0
# 핫픽스 시작
git flow hotfix start critical-bug
# 핫픽스 완료
git flow hotfix finish critical-bug
GitHub Flow
GitHub Flow는 더 단순한 워크플로우로, 지속적 배포에 적합합니다.
워크플로우
- main 브랜치에서 새 브랜치 생성
- 코드 작성 및 커밋
- Pull Request 생성
- 코드 리뷰 및 토론
- 테스트 및 배포
- main 브랜치로 병합
# 1. 새 브랜치 생성
git checkout -b feature/user-authentication
# 2. 개발 및 커밋
git add .
git commit -m "Add user authentication logic"
# 3. 원격 브랜치로 푸시
git push -u origin feature/user-authentication
# 4. GitHub에서 Pull Request 생성
# 5. 리뷰 후 main으로 병합
GitLab Flow
GitLab Flow는 환경별 브랜치를 사용하여 배포를 관리합니다.
브랜치 구조
- main: 개발 브랜치
- pre-production: 스테이징 환경
- production: 프로덕션 환경
커밋 메시지 컨벤션
Conventional Commits
구조화된 커밋 메시지 형식으로 자동화 도구와 호환성이 좋습니다.
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
타입 종류
- feat: 새로운 기능
- fix: 버그 수정
- docs: 문서 수정
- style: 코드 스타일 변경 (기능 변경 없음)
- refactor: 코드 리팩토링
- test: 테스트 추가/수정
- chore: 빌드, 패키지 매니저 설정 등
예시
git commit -m "feat(auth): add OAuth2 login support"
git commit -m "fix(api): resolve null pointer exception in user service"
git commit -m "docs: update API documentation for v2.0"
git commit -m "refactor(database): optimize query performance"
충돌 해결
병합 충돌 해결
# 병합 시도
git merge feature-branch
# 충돌 발생 시 충돌 파일 확인
git status
# 충돌 파일 편집 (충돌 마커 제거)
# <<<<<<< HEAD
# 현재 브랜치 코드
# =======
# 병합할 브랜치 코드
# >>>>>>> feature-branch
# 충돌 해결 후 스테이징
git add conflicted-file.txt
# 병합 완료
git commit
충돌 해결 도구
# 병합 도구 설정 (VS Code)
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# 병합 도구 실행
git mergetool
# 임시 파일 정리
git clean -f *.orig
고급 Git 기능
Stash (임시 저장)
# 현재 작업 임시 저장
git stash
# 메시지와 함께 저장
git stash save "작업 중인 로그인 기능"
# stash 목록 조회
git stash list
# stash 적용 (stash 유지)
git stash apply
# stash 적용 후 삭제
git stash pop
# 특정 stash 적용
git stash apply stash@{2}
# stash 삭제
git stash drop stash@{0}
# 모든 stash 삭제
git stash clear
Cherry-pick
# 특정 커밋을 현재 브랜치로 가져오기
git cherry-pick commit-hash
# 여러 커밋 가져오기
git cherry-pick commit1 commit2
# 커밋 메시지 편집과 함께
git cherry-pick -e commit-hash
# 충돌 발생 시 해결 후 계속
git cherry-pick --continue
# cherry-pick 중단
git cherry-pick --abort
태그 관리
# 경량 태그 생성
git tag v1.0.0
# 주석 태그 생성
git tag -a v1.0.0 -m "Release version 1.0.0"
# 태그 목록 조회
git tag
# 태그 정보 상세 조회
git show v1.0.0
# 태그 푸시
git push origin v1.0.0
# 모든 태그 푸시
git push origin --tags
# 태그 삭제 (로컬)
git tag -d v1.0.0
# 태그 삭제 (원격)
git push origin --delete v1.0.0
Pull Request/Merge Request 전략
PR 생성 가이드라인
1. 명확한 제목과 설명
## 변경 사항
- 사용자 인증 API 추가
- JWT 토큰 기반 인증 구현
## 테스트
- [ ] 단위 테스트 통과
- [ ] 통합 테스트 통과
- [ ] 수동 테스트 완료
## 체크리스트
- [ ] 코드 리뷰 요청
- [ ] 문서 업데이트
- [ ] 브레이킹 체인지 여부 확인
2. 작은 단위로 PR 생성
- 한 번에 하나의 기능 또는 수정사항
- 리뷰어가 이해하기 쉬운 크기
- 최대 400줄 이하 권장
3. 적절한 리뷰어 지정
- 해당 영역 전문가
- 코드 소유자 (CODEOWNERS 파일 활용)
코드 리뷰 모범 사례
리뷰어를 위한 가이드
## 리뷰 체크 포인트
1. **기능성**: 코드가 의도한 대로 작동하는가?
2. **가독성**: 코드가 이해하기 쉬운가?
3. **성능**: 성능 이슈가 없는가?
4. **보안**: 보안 취약점이 없는가?
5. **테스트**: 적절한 테스트가 있는가?
6. **문서**: 필요한 문서가 업데이트되었는가?
건설적인 피드백 예시
✅ 좋은 피드백:
"이 함수는 너무 복잡해 보입니다. 작은 함수로 분리하는 것은 어떨까요?"
❌ 좋지 않은 피드백:
"이 코드는 완전히 잘못되었습니다."
팀 협업 규칙
브랜치 네이밍 컨벤션
# 기능 개발
feature/user-authentication
feature/payment-integration
# 버그 수정
bugfix/login-error
bugfix/memory-leak
# 핫픽스
hotfix/security-patch
hotfix/critical-bug
# 릴리스
release/v1.2.0
release/2024-q1
# 개발 환경
development/new-build-system
커밋 규칙
- 작은 단위로 자주 커밋
- 의미 있는 커밋 메시지
- 각 커밋은 하나의 논리적 변경사항
- 빌드가 깨지지 않는 상태로 커밋
.gitignore 설정
# 운영체제
.DS_Store
Thumbs.db
# IDE
.vscode/
.idea/
*.swp
*.swo
# 언어별
node_modules/
*.pyc
target/
bin/
obj/
# 환경 설정
.env
.env.local
config/secrets.yml
# 로그
*.log
logs/
# 빌드 결과물
dist/
build/
Git Hooks
Pre-commit Hook 예시
#!/bin/sh
# .git/hooks/pre-commit
# 코드 스타일 검사
npm run lint
if [ $? -ne 0 ]; then
echo "Lint 검사 실패. 커밋을 중단합니다."
exit 1
fi
# 테스트 실행
npm test
if [ $? -ne 0 ]; then
echo "테스트 실패. 커밋을 중단합니다."
exit 1
fi
Husky를 이용한 Hook 관리
{
"husky": {
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
"pre-push": "npm test"
}
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write",
"git add"
]
}
}
문제 해결
자주 발생하는 문제들
1. 잘못된 커밋 수정
# 마지막 커밋 메시지 수정
git commit --amend -m "올바른 커밋 메시지"
# 파일 추가 후 마지막 커밋에 포함
git add forgotten-file.txt
git commit --amend --no-edit
# 여러 커밋 수정 (대화형 리베이스)
git rebase -i HEAD~3
2. 커밋 취소
# 마지막 커밋 취소 (변경사항 유지)
git reset --soft HEAD~1
# 마지막 커밋 취소 (변경사항 제거)
git reset --hard HEAD~1
# 특정 커밋으로 되돌리기
git revert commit-hash
3. 브랜치 복구
# 삭제된 브랜치 복구
git reflog
git checkout -b recovered-branch commit-hash
# 잃어버린 커밋 찾기
git fsck --lost-found
보안 고려사항
민감한 정보 관리
# 이미 커밋된 민감한 파일 제거
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch secrets.txt' \
--prune-empty --tag-name-filter cat -- --all
# BFG Repo-Cleaner 사용 (더 빠른 방법)
bfg --delete-files secrets.txt
git reflog expire --expire=now --all
git gc --prune=now --aggressive
GPG 서명
# GPG 키 생성 및 설정
gpg --gen-key
git config --global user.signingkey YOUR_KEY_ID
git config --global commit.gpgsign true
# 서명된 커밋 생성
git commit -S -m "서명된 커밋"
# 서명 검증
git log --show-signature
성능 최적화
대용량 저장소 최적화
# 저장소 크기 확인
git count-objects -vH
# 가비지 컬렉션
git gc --aggressive --prune=now
# 큰 파일 찾기
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
sed -n 's/^blob //p' | \
sort --numeric-sort --key=2 | \
tail -10
# Shallow clone (히스토리 제한)
git clone --depth 1 https://github.com/user/repo.git
Git LFS (Large File Storage)
# Git LFS 설치 및 초기화
git lfs install
# 대용량 파일 추적
git lfs track "*.psd"
git lfs track "*.zip"
# .gitattributes 파일 커밋
git add .gitattributes
git commit -m "Add Git LFS tracking"
# LFS 파일 상태 확인
git lfs ls-files
결론
Git은 단순한 버전 관리 도구를 넘어서 팀 협업의 핵심 인프라입니다. 효과적인 Git 사용을 위해서는 기본 명령어 숙지와 함께 팀에 적합한 워크플로우를 선택하고, 일관된 규칙을 설정하는 것이 중요합니다.
성공적인 Git 협업을 위한 핵심 포인트는 다음과 같습니다:
- 명확한 브랜치 전략 수립
- 일관된 커밋 메시지 컨벤션
- 효과적인 코드 리뷰 프로세스
- 자동화된 품질 검사 도구 활용
- 지속적인 학습과 개선
Git을 단순히 백업 도구로 사용하는 것이 아니라, 코드의 히스토리를 관리하고 팀원 간의 소통을 원활하게 하는 협업 플랫폼으로 활용할 때 진정한 가치를 발휘할 수 있습니다.
'IT정보' 카테고리의 다른 글
백엔드 개발 로드맵 (10) | 2025.08.17 |
---|---|
HTTPS 보안 구현법 완전 가이드 (7) | 2025.08.17 |
SEO 최적화 완전 가이드 (14) | 2025.08.17 |
데이터베이스 설계 원칙 가이드 (9) | 2025.08.16 |
네트워크 보안 구축 완전 가이드 (8) | 2025.08.16 |