Git 명령어 완전 정복: 초보자부터 고수까지의 필수 가이드
🚀 Git 명령어 완전 정복하기
개발자라면 피할 수 없는 필수 도구, Git! 하지만 처음 접하는 개발자들에게는 복잡하고 어려운 도구로 느껴지죠. 수많은 명령어와 옵션들, 그리고 브랜치 개념까지... 이 모든 것을 체계적으로 정복해보겠습니다.
이 가이드를 통해 Git의 기초부터 고급 활용법까지, 실무에서 바로 쓸 수 있는 모든 것을 배워보도록 하겠습니다.
🔍 Git이란 무엇인가?
Git은 분산 버전 관리 시스템으로, 코드의 변경 사항을 추적하고 관리하는 도구입니다.
- 버전 관리: 파일의 변경 이력을 체계적으로 관리
- 협업: 여러 개발자가 동시에 작업 가능
- 백업: 분산 구조로 데이터 손실 방지
- 브랜치: 독립적인 작업 환경 제공
📦 Git 설치와 초기 설정
운영체제별 설치
# Windows
https://git-scm.com/download/win 에서 다운로드
# macOS
brew install git
# Ubuntu/Debian
sudo apt update
sudo apt install git
# CentOS/RHEL
sudo yum install git
# 또는
sudo dnf install git
필수 초기 설정
# 사용자 정보 설정 (필수)
git config --global user.name "홍길동"
git config --global user.email "[email protected]"
# 기본 브랜치 이름 설정
git config --global init.defaultBranch main
# 줄바꿈 설정 (Windows)
git config --global core.autocrlf true
# 줄바꿈 설정 (macOS/Linux)
git config --global core.autocrlf input
# 설정 확인
git config --list
유용한 추가 설정
# 기본 에디터 설정
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # Vim
# 컬러 출력 활성화
git config --global color.ui auto
# 긴 경로명 지원 (Windows)
git config --global core.longpaths true
# Push 기본 동작 설정
git config --global push.default simple
🏗️ Git 저장소 기본 조작
저장소 생성과 복제
# 새 저장소 초기화
git init
git init my-project # 디렉터리와 함께 생성
# 원격 저장소 복제
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git my-folder # 폴더명 지정
# 브랜치만 복제
git clone -b develop https://github.com/user/repo.git
파일 상태 확인
# 작업 디렉터리 상태 확인
git status
git status -s # 간단한 형태
# 변경 사항 확인
git diff # 작업 디렉터리 vs 스테이징 영역
git diff --staged # 스테이징 영역 vs 저장소
git diff HEAD # 작업 디렉터리 vs 저장소
# 특정 파일 변경 사항
git diff filename.txt
git diff --staged filename.txt
파일 추가와 커밋
# 파일 스테이징
git add filename.txt # 특정 파일
git add . # 모든 변경사항
git add *.js # 패턴 매칭
git add -A # 모든 변경사항 (삭제 포함)
git add -u # 수정/삭제된 파일만
# 대화형 스테이징
git add -i
git add -p # 파일 일부만 스테이징
# 커밋
git commit -m "커밋 메시지"
git commit -am "추가와 커밋을 한번에" # 추적 중인 파일만
git commit --amend -m "마지막 커밋 수정"
📚 커밋 히스토리 관리
로그 확인
# 기본 로그
git log
git log --oneline # 한 줄로 표시
git log --graph # 그래프 형태
git log --all # 모든 브랜치
# 고급 로그 옵션
git log --oneline --graph --all --decorate
git log -p # 변경사항 포함
git log --stat # 통계 정보
git log --since="2 weeks ago" # 날짜 조건
git log --author="홍길동" # 작성자 조건
# 특정 파일 히스토리
git log filename.txt
git log --follow filename.txt # 파일명 변경 추적
커밋 되돌리기
# 작업 디렉터리 변경사항 취소
git restore filename.txt # 특정 파일
git restore . # 모든 파일
# 스테이징 취소
git restore --staged filename.txt
git reset HEAD filename.txt # 구버전 방식
# 커밋 취소 (3가지 방식)
git reset --soft HEAD~1 # 커밋만 취소
git reset --mixed HEAD~1 # 커밋 + 스테이징 취소 (기본값)
git reset --hard HEAD~1 # 모든 변경사항 취소 (위험)
# 안전한 되돌리기 (새 커밋 생성)
git revert HEAD # 최근 커밋 되돌리기
git revert commit-hash # 특정 커밋 되돌리기
🌿 브랜치 마스터하기
브랜치 기본 조작
# 브랜치 목록 확인
git branch # 로컬 브랜치
git branch -r # 원격 브랜치
git branch -a # 모든 브랜치
# 브랜치 생성
git branch feature-login # 브랜치 생성만
git checkout -b feature-login # 생성 후 이동
git switch -c feature-login # 최신 방식
# 브랜치 이동
git checkout feature-login # 기존 방식
git switch feature-login # 최신 방식
# 브랜치 삭제
git branch -d feature-login # 안전 삭제
git branch -D feature-login # 강제 삭제
브랜치 병합
# Fast-forward 병합
git checkout main
git merge feature-login
# 3-way 병합 (병합 커밋 생성)
git merge --no-ff feature-login
# 충돌 해결
# 1. 충돌 파일 수정
# 2. git add conflicted-file.txt
# 3. git commit
# 병합 취소
git merge --abort
리베이스 활용
# 기본 리베이스
git checkout feature-branch
git rebase main
# 대화형 리베이스 (커밋 히스토리 정리)
git rebase -i HEAD~3 # 최근 3개 커밋
# 리베이스 옵션들:
# pick: 커밋 유지
# reword: 커밋 메시지 수정
# edit: 커밋 수정
# squash: 이전 커밋과 합치기
# drop: 커밋 삭제
# 리베이스 중단/계속
git rebase --abort
git rebase --continue
🌐 원격 저장소 연동
원격 저장소 관리
# 원격 저장소 추가
git remote add origin https://github.com/user/repo.git
# 원격 저장소 확인
git remote -v
# 원격 저장소 정보 변경
git remote set-url origin https://github.com/user/new-repo.git
# 원격 저장소 삭제
git remote remove origin
Push와 Pull
# Push
git push origin main # 특정 브랜치
git push -u origin main # 업스트림 설정
git push --all # 모든 브랜치
git push --tags # 태그 푸시
# Pull
git pull origin main # Fetch + Merge
git pull --rebase origin main # Fetch + Rebase
# Fetch (병합하지 않고 가져오기만)
git fetch origin
git fetch --all
🏷️ 태그와 릴리즈 관리
# 태그 생성
git tag v1.0.0 # 간단한 태그
git tag -a v1.0.0 -m "버전 1.0.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 --delete v1.0.0 # 원격
🔧 고급 Git 명령어
Stash (임시 저장)
# Stash 생성
git stash # 기본 stash
git stash -m "작업 중인 기능" # 메시지 포함
git stash -u # 추적되지 않는 파일 포함
# Stash 목록
git stash list
# Stash 적용
git stash apply # 최근 stash 적용
git stash apply stash@{2} # 특정 stash 적용
git stash pop # 적용 후 삭제
# Stash 삭제
git stash drop stash@{0}
git stash clear # 모든 stash 삭제
Cherry-pick
# 특정 커밋만 가져오기
git cherry-pick commit-hash
git cherry-pick commit1..commit3 # 범위 지정
# 충돌 시
git cherry-pick --continue
git cherry-pick --abort
Blame과 Bisect
# 파일의 각 줄 작성자 확인
git blame filename.txt
git blame -L 10,20 filename.txt # 특정 줄 범위
# 버그 발생 커밋 찾기
git bisect start
git bisect bad # 현재 커밋이 버그 있음
git bisect good v1.0.0 # v1.0.0은 정상
# ... 테스트 후 git bisect good/bad 반복
git bisect reset # 종료
🔀 고급 브랜치 전략
Git Flow
# Git Flow 초기화
git flow init
# 기능 브랜치
git flow feature start feature-name
git flow feature finish feature-name
# 릴리즈 브랜치
git flow release start 1.0.0
git flow release finish 1.0.0
# 핫픽스
git flow hotfix start hotfix-name
git flow hotfix finish hotfix-name
GitHub Flow (단순화된 전략)
# 1. main 브랜치에서 새 브랜치 생성
git checkout main
git pull origin main
git checkout -b feature/user-auth
# 2. 작업 후 원격에 푸시
git push -u origin feature/user-auth
# 3. Pull Request 생성 (GitHub 웹에서)
# 4. 코드 리뷰 후 main에 병합
# 5. 브랜치 삭제
git checkout main
git pull origin main
git branch -d feature/user-auth
🚀 Git Hooks와 자동화
클라이언트 훅
# .git/hooks/pre-commit
#!/bin/bash
# 커밋 전 코드 품질 검사
npm run lint
npm run test
# 실행 권한 부여
chmod +x .git/hooks/pre-commit
서버 훅
# .git/hooks/post-receive
#!/bin/bash
# 푸시 후 자동 배포
cd /var/www/html
git --git-dir=/var/repo/project.git --work-tree=/var/www/html checkout -f
npm install
npm run build
⚠️ 문제 해결과 복구
일반적인 문제들
# 잘못된 커밋 메시지 수정
git commit --amend -m "올바른 메시지"
# 파일을 잘못 추가했을 때
git reset HEAD filename.txt
# 커밋을 잘못했을 때
git reset --soft HEAD~1 # 커밋만 취소
git reset HEAD~1 # 스테이징도 취소
# 원격과 로컬이 달라질 때
git fetch origin
git reset --hard origin/main # 위험: 로컬 변경사항 손실
데이터 복구
# 삭제된 커밋 복구
git reflog # 모든 HEAD 변경 이력
git reset --hard HEAD@{2} # 특정 상태로 복구
# 삭제된 브랜치 복구
git reflog
git checkout -b recovered-branch HEAD@{n}
🛠️ Git 설정 최적화
별칭(Alias) 설정
# 자주 사용하는 명령어 단축
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'
# 고급 별칭
git config --global alias.lg "log --oneline --graph --all --decorate"
git config --global alias.adog "log --all --decorate --oneline --graph"
성능 최적화
# 대용량 저장소 최적화
git config --global core.preloadindex true
git config --global core.fscache true
git config --global gc.auto 256
# 병렬 처리 활성화
git config --global checkout.workers 0 # CPU 코어 수만큼
🎯 실무 활용 팁
효과적인 커밋 메시지
# 좋은 커밋 메시지 형식
feat: 사용자 로그인 기능 추가
fix: 비밀번호 validation 버그 수정
docs: README에 설치 가이드 추가
style: 코드 포매팅 정리
refactor: 사용자 서비스 로직 개선
test: 로그인 API 테스트 케이스 추가
# 상세한 메시지 예시
feat: 사용자 로그인 기능 추가
- JWT 토큰 기반 인증 구현
- 로그인 실패 시 에러 처리
- 자동 로그인 기능 추가
Closes #123
협업 베스트 프랙티스
# .gitignore 예시
# 의존성
node_modules/
vendor/
# 환경 설정
.env
.env.local
# 빌드 결과물
dist/
build/
# IDE 설정
.vscode/
.idea/
# OS 파일
.DS_Store
Thumbs.db
📊 Git 성능 모니터링
# 저장소 크기 확인
git count-objects -vH
# 대용량 파일 찾기
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 gc --aggressive --prune=now
git repack -Ad
🎓 마무리
Git을 마스터하는 것은 하루아침에 되지 않습니다. 하지만 이 가이드의 명령어들을 실제 프로젝트에서 꾸준히 사용하다 보면, 어느새 Git의 강력함을 실감하게 될 것입니다.
기억할 점들:
- 🎯 작은 커밋을 자주 하세요 - 큰 변경사항보다 작은 단위로
- 📝 명확한 커밋 메시지를 작성하세요 - 6개월 후의 자신을 위해
- 🌿 브랜치를 적극 활용하세요 - 기능별로 독립적인 작업 환경
- 🔄 정기적으로 원격 저장소와 동기화하세요 - 충돌을 최소화
- ⚡ git stash를 활용하세요 - 임시 작업 보관에 유용
Git은 단순한 버전 관리 도구를 넘어서, 개발자의 생산성을 획기적으로 향상시키는 강력한 도구입니다. 오늘부터 이 가이드를 참고해서 더 효율적인 개발 워크플로우를 만들어보세요! 🚀
Featured image by Yancy Min on Unsplash