Git 바이블
목차
- Git이란?
- Git 설치 및 초기 설정
- 기본 개념
- 기본 명령어
- 브랜치 (Branch)
- 원격 저장소 (Remote Repository)
- 고급 기능
- 실무 워크플로우
- 문제 해결
- 유용한 팁
Git이란?
Git은 **분산 버전 관리 시스템(Distributed Version Control System)**입니다. 코드의 변경 사항을 추적하고, 여러 개발자가 협업할 수 있도록 도와주는 도구입니다.
Git의 장점
- 분산형: 모든 사용자가 전체 프로젝트 히스토리를 가짐
- 빠른 성능: 대부분의 작업이 로컬에서 수행됨
- 데이터 무결성: SHA-1 해시로 모든 변경사항을 추적
- 브랜치: 가벼운 브랜치 생성으로 병렬 개발 지원
Git 설치 및 초기 설정
설치
Windows:
# Git 공식 사이트에서 다운로드
https://git-scm.com/download/win
macOS:
# Homebrew 사용
brew install git
# 또는 Xcode Command Line Tools
xcode-select --install
Linux (Ubuntu/Debian):
sudo apt update
sudo apt install git
초기 설정
# 사용자 이름 설정
git config --global user.name "Your Name"
# 이메일 설정
git config --global user.email "your.email@example.com"
# 기본 편집기 설정 (예: VS Code)
git config --global core.editor "code --wait"
# 설정 확인
git config --list
기본 개념
세 가지 영역
- Working Directory (작업 디렉토리): 현재 작업 중인 파일들
- Staging Area (스테이징 영역): 커밋할 준비가 된 파일들
- Repository (저장소): 커밋된 파일들의 히스토리
Working Directory → (git add) → Staging Area → (git commit) → Repository
파일 상태
- Untracked: Git이 추적하지 않는 새 파일
- Modified: 수정되었지만 아직 스테이징되지 않은 파일
- Staged: 스테이징되어 커밋할 준비가 된 파일
- Committed: 저장소에 안전하게 저장된 파일
기본 명령어
저장소 초기화 및 복제
# 새 Git 저장소 초기화
git init
# 기존 저장소 복제
git clone <repository-url>
git clone https://github.com/user/repo.git
파일 추가 및 커밋
# 파일 상태 확인
git status
# 특정 파일 스테이징
git add filename.txt
# 모든 변경사항 스테이징
git add .
# 스테이징된 파일 커밋
git commit -m "커밋 메시지"
# 스테이징과 커밋을 한 번에 (추적 중인 파일만)
git commit -am "커밋 메시지"
히스토리 확인
# 커밋 히스토리 보기
git log
# 간단한 형태로 히스토리 보기
git log --oneline
# 그래프 형태로 브랜치 히스토리 보기
git log --graph --oneline --all
# 특정 파일의 히스토리
git log filename.txt
변경사항 확인
# 작업 디렉토리의 변경사항 확인
git diff
# 스테이징된 변경사항 확인
git diff --staged
# 특정 커밋과 비교
git diff <commit-hash>
브랜치 (Branch)
브랜치는 독립적인 작업 공간을 만들어 병렬 개발을 가능하게 합니다.
브랜치 기본 명령어
# 브랜치 목록 확인
git branch
# 새 브랜치 생성
git branch <branch-name>
# 브랜치 전환
git checkout <branch-name>
# 브랜치 생성과 동시에 전환
git checkout -b <branch-name>
# 최신 문법 (Git 2.23+)
git switch <branch-name>
git switch -c <branch-name>
브랜치 병합
# 현재 브랜치에 다른 브랜치 병합
git merge <branch-name>
# 빨리감기 병합 방지 (항상 병합 커밋 생성)
git merge --no-ff <branch-name>
# 브랜치 삭제
git branch -d <branch-name>
# 강제 삭제
git branch -D <branch-name>
병합 충돌 해결
# 충돌 발생 시 상태 확인
git status
# 충돌 해결 후 파일 추가
git add <resolved-file>
# 병합 완료
git commit
원격 저장소 (Remote Repository)
원격 저장소 관리
# 원격 저장소 추가
git remote add origin <repository-url>
# 원격 저장소 목록 확인
git remote -v
# 원격 저장소 정보 확인
git remote show origin
# 원격 저장소 제거
git remote remove origin
푸시와 풀
# 로컬 변경사항을 원격 저장소에 푸시
git push origin <branch-name>
# 첫 푸시 시 업스트림 설정
git push -u origin <branch-name>
# 원격 저장소의 변경사항 가져오기
git pull origin <branch-name>
# 원격 저장소 정보만 가져오기 (병합하지 않음)
git fetch origin
원격 브랜치
# 원격 브랜치 목록 확인
git branch -r
# 모든 브랜치 확인 (로컬 + 원격)
git branch -a
# 원격 브랜치를 로컬로 가져오기
git checkout -b <local-branch> origin/<remote-branch>
# 원격 브랜치 추적
git branch --set-upstream-to=origin/<branch-name>
고급 기능
Rebase
Rebase는 커밋 히스토리를 선형으로 만들어 깔끔하게 정리합니다.
# 브랜치를 다른 브랜치 위로 재배치
git rebase <base-branch>
# 인터랙티브 리베이스 (커밋 수정/합치기/순서 변경)
git rebase -i HEAD~3
# 리베이스 중단
git rebase --abort
# 리베이스 계속
git rebase --continue
Stash
임시로 변경사항을 저장하는 기능입니다.
# 현재 변경사항 임시 저장
git stash
# 메시지와 함께 stash
git stash save "작업 중인 기능"
# stash 목록 확인
git stash list
# 가장 최근 stash 적용
git stash apply
# stash 적용하고 삭제
git stash pop
# 특정 stash 적용
git stash apply stash@{1}
# stash 삭제
git stash drop stash@{1}
Reset과 Revert
# 커밋 취소 (히스토리에서 제거)
git reset --soft HEAD~1 # 커밋만 취소, 변경사항 유지
git reset --mixed HEAD~1 # 커밋과 스테이징 취소
git reset --hard HEAD~1 # 모든 변경사항 완전 삭제
# 커밋 되돌리기 (새로운 커밋 생성)
git revert <commit-hash>
Cherry-pick
다른 브랜치의 특정 커밋만 가져오는 기능입니다.
# 특정 커밋을 현재 브랜치에 적용
git cherry-pick <commit-hash>
# 여러 커밋 cherry-pick
git cherry-pick <commit1> <commit2>
실무 워크플로우
Git Flow
가장 널리 사용되는 브랜치 전략입니다.
master (main) ──●────●────●── (배포용 브랜치)
│ │ │
develop ──●────●────●── (개발 브랜치)
╱ ╲ ╱ ╲
feature/login ──●───●╱ ╲
╲
feature/payment ──────●────●──
브랜치 종류:
master/main
: 배포 가능한 안정적인 버전develop
: 개발 중인 최신 버전feature/*
: 새로운 기능 개발release/*
: 배포 준비hotfix/*
: 긴급 버그 수정
GitHub Flow
더 간단한 워크플로우입니다.
# 1. 새 기능 브랜치 생성
git checkout -b feature/new-feature
# 2. 개발 및 커밋
git add .
git commit -m "새 기능 추가"
# 3. 원격 저장소에 푸시
git push origin feature/new-feature
# 4. Pull Request 생성 및 코드 리뷰
# 5. 병합 후 브랜치 삭제
문제 해결
자주 발생하는 문제들
1. 커밋 메시지 수정
# 가장 최근 커밋 메시지 수정
git commit --amend -m "새로운 커밋 메시지"
2. 잘못된 파일 커밋
# 파일을 스테이징에서 제거
git reset HEAD <filename>
# 파일을 Git 추적에서 제거 (파일은 유지)
git rm --cached <filename>
3. 병합 충돌
# 충돌 발생한 파일들을 수동으로 편집 후
git add <resolved-files>
git commit
4. 푸시 거부 (push rejected)
# 원격 저장소의 변경사항을 먼저 가져오기
git pull origin <branch-name>
# 충돌 해결 후 다시 푸시
git push origin <branch-name>
유용한 팁
별칭(Alias) 설정
# 자주 사용하는 명령어에 별칭 만들기
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'
.gitignore 파일
추적하지 않을 파일들을 지정합니다.
# 의존성
node_modules/
*.log
# 빌드 결과물
dist/
build/
# 환경 설정
.env
.env.local
# IDE 설정
.vscode/
.idea/
# OS 생성 파일
.DS_Store
Thumbs.db
유용한 Git 명령어
# 브랜치 그래프 예쁘게 보기
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
# 파일별 기여도 확인
git shortlog -sn
# 특정 작성자의 커밋만 보기
git log --author="작성자명"
# 특정 기간의 커밋만 보기
git log --since="2023-01-01" --until="2023-12-31"
# 커밋에서 특정 문자열 검색
git log --grep="버그"
# 파일의 각 줄이 언제 누가 수정했는지 확인
git blame filename.txt
성능 최적화
# Git 저장소 최적화
git gc
# 리모트 브랜치 정리
git remote prune origin
# 로컬에서 삭제된 원격 브랜치 참조 정리
git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin
마무리
Git은 강력한 도구이지만 학습 곡선이 있습니다. 이 가이드의 명령어들을 실제 프로젝트에서 연습해보세요. 처음에는 기본 명령어(add, commit, push, pull)부터 시작해서 점차 고급 기능들을 익혀나가면 됩니다.
추가 학습 자료:
- Pro Git Book (무료 온라인 책)
- Learn Git Branching (인터랙티브 학습)
- Atlassian Git Tutorials
기억할 점:
- 자주 커밋하세요 (작은 단위로)
- 의미 있는 커밋 메시지를 작성하세요
- 브랜치를 적극 활용하세요
- 팀의 Git 워크플로우를 따르세요