hobokai 님의 블로그

Git 완전 정복 가이드: 초보자부터 고급 사용자까지 버전 관리 마스터하기 본문

DevOps

Git 완전 정복 가이드: 초보자부터 고급 사용자까지 버전 관리 마스터하기

hobokai 2025. 7. 23. 08:38

목차

  1. Git이란 무엇인가?
  2. Git 설치 및 초기 설정
  3. Git 기본 개념
  4. 기본 명령어 완전 정복
  5. 브랜치 전략과 활용
  6. 원격 저장소 관리
  7. 협업 워크플로우
  8. 고급 Git 기능
  9. 문제 해결 및 복구
  10. Git 도구 및 GUI
  11. 베스트 프랙티스
  12. 결론

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의 세 가지 상태

  1. Modified (수정됨): 파일이 변경되었지만 아직 스테이징되지 않음
  2. Staged (스테이징됨): 다음 커밋에 포함될 변경사항으로 표시
  3. 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 마스터 로드맵

  1. 기초: 기본 명령어, 워크플로우 이해
  2. 중급: 브랜치 전략, 충돌 해결, 원격 저장소 관리
  3. 고급: 리베이스, 훅, 고급 기능 활용
  4. 전문가: 팀 워크플로우 설계, 성능 최적화

계속 학습하기 위한 리소스

마지막 조언

  • 실습이 핵심: 이론보다 실제 프로젝트에서 사용해보세요
  • 작은 커밋: 논리적으로 완결된 작은 단위로 커밋하세요
  • 명확한 메시지: 미래의 자신과 팀원을 위해 명확한 커밋 메시지를 작성하세요
  • 브랜치 활용: 기능별로 브랜치를 나누어 작업하세요
  • 백업 습관: 정기적으로 원격 저장소에 푸시하세요

Git을 마스터하고 효율적인 개발 워크플로우를 구축해보세요! 🚀