Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
| 28 | 29 | 30 | 31 |
Tags
- 보안
- 모니터링
- kubernetes
- 분산 모니터링
- 클러스터
- Kafka 클러스터
- 마이크로서비스
- rabbitmq
- 서비스 설계
- 서비스 메시
- Python
- 마이크로서비스 운영
- 이벤트 스트리밍
- ApacheBench
- 모노리스 분해
- CI/CD
- 고가용성
- infrastructureascode
- 메시지 브로커
- 분산 시스템
- 클라우드
- RabbitMQ Exchange
- docker
- 메시징 패턴
- 세션저장소
- 마이크로서비스 통신
- 인메모리데이터베이스
- 프로덕션 운영
- 컨테이너오케스트레이션
- devops
Archives
- Today
- Total
hobokai 님의 블로그
Git 완전 정복 가이드: 초보자부터 고급 사용자까지 버전 관리 마스터하기 본문
목차
- Git이란 무엇인가?
- Git 설치 및 초기 설정
- Git 기본 개념
- 기본 명령어 완전 정복
- 브랜치 전략과 활용
- 원격 저장소 관리
- 협업 워크플로우
- 고급 Git 기능
- 문제 해결 및 복구
- Git 도구 및 GUI
- 베스트 프랙티스
- 결론
Git이란 무엇인가?
Git은 2005년 리누스 토르발스가 개발한 분산 버전 관리 시스템입니다. 소스 코드의 변경 이력을 추적하고, 여러 개발자가 동시에 작업할 수 있도록 지원합니다.
Git의 핵심 장점
- 🚀 분산형 구조 - 로컬에서 완전한 히스토리 보유
- 🔒 데이터 무결성 - SHA-1 해시로 모든 변경사항 추적
- ⚡ 빠른 성능 - 로컬 작업으로 빠른 속도
- 🌿 강력한 브랜칭 - 가벼운 브랜치 생성/병합
- 🔄 비선형 개발 - 복잡한 개발 워크플로우 지원
- 📚 완전한 히스토리 - 모든 변경사항 추적 가능
Git vs 다른 VCS 비교
| 특성 | Git | SVN | Mercurial |
|---|---|---|---|
| 구조 | 분산형 | 중앙집중형 | 분산형 |
| 속도 | 매우 빠름 | 보통 | 빠름 |
| 브랜칭 | 매우 강력 | 제한적 | 좋음 |
| 러닝커브 | 높음 | 낮음 | 보통 |
| 인기도 | 최고 | 감소 | 낮음 |
Git 설치 및 초기 설정
설치하기
Windows
# Git for Windows 다운로드
https://git-scm.com/download/win
# Chocolatey 사용
choco install git
# winget 사용
winget install Git.Git
macOS
# Homebrew 사용
brew install git
# Xcode Command Line Tools
xcode-select --install
Linux
# Ubuntu/Debian
sudo apt install git
# CentOS/RHEL
sudo yum install git
# 또는
sudo dnf install git
# Arch Linux
sudo pacman -S git
초기 설정
# 사용자 정보 설정 (필수)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 기본 편집기 설정
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # Vim
# 기본 브랜치 이름 설정
git config --global init.defaultBranch main
# 개행 문자 설정
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # macOS/Linux
# 색상 출력 활성화
git config --global color.ui auto
# 설정 확인
git config --list
git config --global --list
SSH 키 설정 (GitHub/GitLab용)
# SSH 키 생성
ssh-keygen -t ed25519 -C "your.email@example.com"
# SSH 에이전트 시작 (Windows Git Bash)
eval "$(ssh-agent -s)"
# 개인 키 추가
ssh-add ~/.ssh/id_ed25519
# 공개 키 출력 (복사해서 GitHub에 등록)
cat ~/.ssh/id_ed25519.pub
Git 기본 개념
핵심 개념 이해
Working Directory (작업 디렉토리)
↓ git add
Staging Area (스테이징 영역)
↓ git commit
Local Repository (로컬 저장소)
↓ git push
Remote Repository (원격 저장소)
Git의 세 가지 상태
- Modified (수정됨): 파일이 변경되었지만 아직 스테이징되지 않음
- Staged (스테이징됨): 다음 커밋에 포함될 변경사항으로 표시
- Committed (커밋됨): 로컬 데이터베이스에 안전하게 저장됨
Git 객체 모델
# Blob: 파일 내용
# Tree: 디렉토리 구조
# Commit: 스냅샷 + 메타데이터
# Tag: 특정 커밋을 가리키는 포인터
기본 명령어 완전 정복
저장소 초기화 및 복제
# 새 저장소 초기화
git init
git init project-name
# 기존 저장소 복제
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git my-project
# 특정 브랜치만 복제
git clone -b branch-name https://github.com/user/repo.git
기본 워크플로우
# 상태 확인
git status
git status -s # 짧은 형식
# 파일 추가
git add filename
git add . # 모든 파일
git add *.js # 패턴 매칭
git add -p # 대화형 추가
# 커밋 생성
git commit -m "커밋 메시지"
git commit -am "add & commit" # 추가 + 커밋
git commit --amend # 마지막 커밋 수정
# 변경사항 확인
git diff # 작업 디렉토리 vs 스테이징
git diff --staged # 스테이징 vs 마지막 커밋
git diff HEAD # 작업 디렉토리 vs 마지막 커밋
히스토리 조회
# 커밋 로그 조회
git log
git log --oneline # 한 줄로 요약
git log --graph # 그래프 형태
git log --stat # 통계 정보 포함
git log -p # 패치 정보 포함
# 특정 조건으로 필터링
git log --author="이름"
git log --since="2023-01-01"
git log --until="2023-12-31"
git log --grep="버그수정"
# 파일별 히스토리
git log filename
git log -p filename # 변경 내용까지
# 예쁜 로그 형식
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
파일 관리
# 파일 삭제
git rm filename
git rm --cached filename # 추적 중지 (파일은 유지)
# 파일 이동/이름 변경
git mv old_name new_name
# 파일 복원
git checkout -- filename # 작업 디렉토리 복원
git reset HEAD filename # 스테이징 취소
git restore filename # Git 2.23+ 복원 명령어
git restore --staged filename # 스테이징 취소
브랜치 전략과 활용
브랜치 기본 조작
# 브랜치 조회
git branch # 로컬 브랜치
git branch -r # 원격 브랜치
git branch -a # 모든 브랜치
# 브랜치 생성 및 전환
git branch branch-name # 생성만
git checkout branch-name # 전환
git checkout -b branch-name # 생성 + 전환
git switch branch-name # Git 2.23+ 전환
git switch -c branch-name # Git 2.23+ 생성 + 전환
# 브랜치 삭제
git branch -d branch-name # 안전 삭제
git branch -D branch-name # 강제 삭제
브랜치 병합
# Fast-forward 병합
git merge feature-branch
# 3-way 병합 (merge commit 생성)
git merge --no-ff feature-branch
# 스쿼시 병합 (커밋 하나로 합치기)
git merge --squash feature-branch
git commit -m "Feature: 새 기능 추가"
리베이스 활용
# 기본 리베이스
git rebase main
# 인터랙티브 리베이스
git rebase -i HEAD~3 # 최근 3개 커밋 수정
# 리베이스 중 충돌 해결
git rebase --continue # 계속 진행
git rebase --abort # 리베이스 취소
인터랙티브 리베이스 명령어
# pick (p): 커밋 사용
# reword (r): 커밋 메시지 수정
# edit (e): 커밋 수정
# squash (s): 이전 커밋과 합치기
# drop (d): 커밋 삭제
# exec (x): 쉘 명령 실행
브랜치 전략
Git Flow
main (production)
├── develop (integration)
├── feature/user-auth
├── feature/payment
└── release/v1.0
└── hotfix/critical-bug
GitHub Flow
main (production + development)
├── feature/user-login
├── feature/api-integration
└── bugfix/login-error
GitLab Flow
main → pre-production → production
├── feature/new-feature
└── environment branches
원격 저장소 관리
원격 저장소 설정
# 원격 저장소 추가
git remote add origin https://github.com/user/repo.git
# 원격 저장소 조회
git remote -v
# 원격 저장소 정보 상세
git remote show origin
# 원격 저장소 URL 변경
git remote set-url origin https://github.com/user/new-repo.git
# 원격 저장소 삭제
git remote remove origin
Push와 Pull
# 푸시 (로컬 → 원격)
git push origin main
git push -u origin main # upstream 설정
git push --all # 모든 브랜치 푸시
git push --tags # 태그 푸시
# 풀 (원격 → 로컬)
git pull origin main
git pull --rebase # 리베이스로 병합
# 페치 (다운로드만, 병합하지 않음)
git fetch origin
git fetch --all
원격 브랜치 관리
# 원격 브랜치 추적
git branch -u origin/main
# 원격 브랜치 체크아웃
git checkout -b local-branch origin/remote-branch
# 원격에서 삭제된 브랜치 정리
git remote prune origin
git fetch -p
협업 워크플로우
Fork & Pull Request 워크플로우
# 1. Fork (GitHub/GitLab에서)
# 2. 로컬에 클론
git clone https://github.com/your-username/repo.git
cd repo
# 3. 원본 저장소 추가
git remote add upstream https://github.com/original-owner/repo.git
# 4. 피처 브랜치 생성
git checkout -b feature/new-feature
# 5. 작업 후 커밋
git add .
git commit -m "feat: 새로운 기능 추가"
# 6. 본인 포크에 푸시
git push origin feature/new-feature
# 7. GitHub/GitLab에서 Pull Request 생성
# 8. 원본 저장소 최신 상태 유지
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
협업 시 충돌 해결
# 1. 충돌 발생 시 상태 확인
git status
# 2. 충돌 파일 수정
# <<<<<<< HEAD
# 현재 브랜치의 내용
# =======
# 병합할 브랜치의 내용
# >>>>>>> branch-name
# 3. 충돌 해결 후 스테이징
git add conflicted-file
# 4. 병합 완료
git commit # 또는 git merge --continue
코드 리뷰 프로세스
# 1. 리뷰 요청 전 체크리스트
git log --oneline # 커밋 히스토리 정리
git diff main # 변경사항 검토
# 2. 리뷰 받은 후 수정
git add .
git commit --amend # 마지막 커밋 수정
git push --force-with-lease # 안전한 강제 푸시
고급 Git 기능
Stash 활용
# 변경사항 임시 저장
git stash
git stash push -m "작업 중인 내용"
# 특정 파일만 스태시
git stash push filename
# 스태시 목록 확인
git stash list
# 스태시 적용
git stash apply # 가장 최근 스태시 적용
git stash apply stash@{1} # 특정 스태시 적용
git stash pop # 적용 + 삭제
# 스태시 삭제
git stash drop stash@{0}
git stash clear # 모든 스태시 삭제
태그 관리
# 태그 생성
git tag v1.0.0 # 라이트웨이트 태그
git tag -a v1.0.0 -m "Version 1.0" # 주석 태그
# 태그 조회
git tag
git tag -l "v1.*" # 패턴 매칭
# 태그 정보 확인
git show v1.0.0
# 태그 푸시
git push origin v1.0.0
git push origin --tags
# 태그 삭제
git tag -d v1.0.0 # 로컬
git push origin :refs/tags/v1.0.0 # 원격
서브모듈 관리
# 서브모듈 추가
git submodule add https://github.com/user/lib.git lib
# 서브모듈 초기화
git submodule init
git submodule update
# 또는 한 번에
git submodule update --init --recursive
# 서브모듈 업데이트
git submodule update --remote
# 서브모듈 삭제
git submodule deinit lib
git rm lib
Git Hooks
# 훅 스크립트 위치
ls .git/hooks/
# 주요 훅들
# pre-commit: 커밋 전 실행
# pre-push: 푸시 전 실행
# post-receive: 서버에서 푸시 받은 후 실행
# 예시: pre-commit 훅 (코드 포맷팅)
#!/bin/sh
npm run lint
고급 검색 및 분석
# 코드에서 검색
git grep "function"
git grep -n "TODO" # 줄 번호 포함
# 바이너리 검색 (git log의 고급 기능)
git log -S"function_name" # 특정 문자열이 추가/삭제된 커밋
git log -G"regex_pattern" # 정규식 패턴
# 파일별 기여도 분석
git blame filename
git log -p --follow filename # 파일 이동까지 추적
# 통계 정보
git shortlog -sn # 기여자별 커밋 수
git log --since="1 month ago" --pretty=tformat: --numstat | gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }'
문제 해결 및 복구
커밋 되돌리기
# 작업 디렉토리 변경사항 취소
git checkout -- filename
git restore filename
# 스테이징 취소
git reset HEAD filename
git restore --staged filename
# 커밋 취소 (다양한 방법)
git reset --soft HEAD~1 # 커밋만 취소 (변경사항 스테이징 유지)
git reset --mixed HEAD~1 # 커밋 + 스테이징 취소 (기본값)
git reset --hard HEAD~1 # 모든 변경사항 완전 삭제
# 안전한 되돌리기 (새 커밋 생성)
git revert HEAD # 마지막 커밋 되돌리기
git revert HEAD~2..HEAD # 범위 되돌리기
손실된 데이터 복구
# reflog로 잃어버린 커밋 찾기
git reflog
git log --walk-reflogs
# 특정 커밋으로 복구
git checkout commit-hash
git branch recovery-branch # 새 브랜치 생성
# 삭제된 브랜치 복구
git branch branch-name commit-hash
충돌 해결 도구
# 병합 도구 설정
git config --global merge.tool vimdiff
git config --global merge.tool vscode
# 병합 도구 실행
git mergetool
# 충돌 상태에서 병합 취소
git merge --abort
git rebase --abort
대용량 파일 및 히스토리 정리
# 큰 파일 찾기
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
# Git LFS 사용
git lfs track "*.psd"
git add .gitattributes
# 히스토리에서 파일 완전 삭제 (주의!)
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path/to/file' --prune-empty --tag-name-filter cat -- --all
Git 도구 및 GUI
명령줄 도구 개선
# Git aliases 설정
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'
# 복잡한 alias 예시
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"
인기 GUI 도구들
| 도구 | 플랫폼 | 특징 | 가격 |
|---|---|---|---|
| GitHub Desktop | Win/Mac | 초보자 친화적 | 무료 |
| SourceTree | Win/Mac | Atlassian 제품 | 무료 |
| GitKraken | 모든 플랫폼 | 강력한 기능 | 유료/무료 |
| Tower | Mac/Win | 전문가용 | 유료 |
| VS Code | 모든 플랫폼 | 편집기 통합 | 무료 |
통합 개발 환경에서 Git
# VS Code 확장 프로그램
- GitLens
- Git Graph
- Git History
# IntelliJ IDEA / WebStorm
- 내장 Git 지원
- Git Flow Integration
# Eclipse
- EGit 플러그인
베스트 프랙티스
커밋 메시지 작성 규칙
# Conventional Commits 형식
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
# 예시들
feat: 사용자 로그인 기능 추가
fix: 비밀번호 검증 오류 수정
docs: API 문서 업데이트
style: 코드 포맷팅 개선
refactor: 사용자 인증 모듈 리팩토링
test: 단위 테스트 추가
chore: 의존성 업데이트
# 타입별 설명
feat: 새로운 기능
fix: 버그 수정
docs: 문서 변경
style: 코드 의미에 영향을 주지 않는 변경사항
refactor: 버그를 수정하거나 기능을 추가하지 않는 코드 변경
test: 테스트 관련
chore: 빌드 부분 혹은 패키지 매니저 수정사항
.gitignore 작성 요령
# 언어별 파일
*.pyc # Python
*.class # Java
node_modules/ # Node.js
target/ # Maven
bin/ # 컴파일된 바이너리
# IDE 파일
.vscode/
.idea/
*.swp
*.swo
# OS 파일
.DS_Store # macOS
Thumbs.db # Windows
*.tmp
# 로그 및 임시 파일
*.log
logs/
tmp/
temp/
# 환경 변수 파일
.env
.env.local
config.local.json
# 빌드 결과물
dist/
build/
out/
브랜치 명명 규칙
# 기능 개발
feature/user-authentication
feature/payment-integration
feature/JIRA-123-user-dashboard
# 버그 수정
bugfix/login-error
hotfix/critical-security-issue
fix/JIRA-456-memory-leak
# 릴리즈
release/v1.2.0
release/2023.11
# 실험적 기능
experiment/new-ui-framework
spike/performance-testing
팀 워크플로우 가이드라인
# 1. 작업 시작 전
git pull origin main # 최신 상태 확인
git checkout -b feature/xyz # 새 브랜치 생성
# 2. 작업 중
git add -p # 논리적 단위로 스테이징
git commit -m "clear message" # 명확한 커밋 메시지
# 3. 작업 완료 후
git rebase -i HEAD~n # 커밋 정리 (선택사항)
git push origin feature/xyz # 브랜치 푸시
# 4. 코드 리뷰 후
git push --force-with-lease # 안전한 강제 푸시
# 5. 병합 후
git checkout main
git pull origin main
git branch -d feature/xyz # 로컬 브랜치 정리
성능 최적화
# 대용량 저장소 최적화
git config core.preloadindex true
git config core.fscache true
git config gc.auto 256
# 부분 클론 (Git 2.19+)
git clone --filter=blob:none <url> # blob 없이 클론
git clone --filter=tree:0 <url> # 최신 커밋만
# 얕은 클론
git clone --depth 1 <url> # 최신 커밋만
git clone --shallow-since="2023-01-01" <url> # 특정 날짜 이후
# 스파스 체크아웃 (일부 파일만)
git config core.sparseCheckout true
echo "src/" >> .git/info/sparse-checkout
git read-tree -m -u HEAD
실전 시나리오 및 해결책
시나리오 1: 실수로 잘못된 파일을 커밋한 경우
# 해결책 1: 마지막 커밋에서 파일 제거
git reset --soft HEAD~1
git reset HEAD unwanted-file
git commit
# 해결책 2: 파일만 제거하고 커밋은 유지
git rm --cached unwanted-file
git commit --amend
시나리오 2: 여러 커밋을 하나로 합치기
# 인터랙티브 리베이스 사용
git rebase -i HEAD~4
# 에디터에서:
# pick commit1
# squash commit2
# squash commit3
# squash commit4
시나리오 3: 다른 브랜치의 특정 커밋만 가져오기
git cherry-pick commit-hash
git cherry-pick -x commit-hash # 원본 커밋 정보 포함
시나리오 4: 작업 중인 내용을 다른 브랜치로 이동
# 현재 작업을 스태시
git stash
# 새 브랜치 생성 및 이동
git checkout -b new-branch
# 스태시 적용
git stash pop
결론
Git은 현대 소프트웨어 개발에서 필수적인 도구입니다. 처음에는 복잡해 보이지만, 체계적으로 학습하면 강력한 협업과 버전 관리가 가능합니다.
Git 마스터 로드맵
- 기초: 기본 명령어, 워크플로우 이해
- 중급: 브랜치 전략, 충돌 해결, 원격 저장소 관리
- 고급: 리베이스, 훅, 고급 기능 활용
- 전문가: 팀 워크플로우 설계, 성능 최적화
계속 학습하기 위한 리소스
- 📚 공식 문서: https://git-scm.com/docs
- 📖 Pro Git Book: https://git-scm.com/book (무료)
- 🎮 Interactive Tutorial: https://learngitbranching.js.org/
- 💻 GitHub Learning Lab: https://lab.github.com/
- 🏆 Atlassian Git Tutorial: https://www.atlassian.com/git/tutorials
마지막 조언
- 실습이 핵심: 이론보다 실제 프로젝트에서 사용해보세요
- 작은 커밋: 논리적으로 완결된 작은 단위로 커밋하세요
- 명확한 메시지: 미래의 자신과 팀원을 위해 명확한 커밋 메시지를 작성하세요
- 브랜치 활용: 기능별로 브랜치를 나누어 작업하세요
- 백업 습관: 정기적으로 원격 저장소에 푸시하세요
Git을 마스터하고 효율적인 개발 워크플로우를 구축해보세요! 🚀
'DevOps' 카테고리의 다른 글
| Terraform 완전 마스터 가이드: Infrastructure as Code로 클라우드 인프라 자동화 (2) | 2025.07.23 |
|---|---|
| Kubernetes 완전 정복 가이드: 컨테이너 오케스트레이션부터 프로덕션까지 (0) | 2025.07.23 |
| Docker 완전 마스터 가이드: 초보자부터 프로덕션까지 컨테이너 기술 정복 (1) | 2025.07.23 |
| Linux OS 완전 가이드: 초보자부터 고급 사용자까지 (0) | 2025.07.23 |