본문으로 건너뛰기

Git 바이블

목차

  1. Git이란?
  2. Git 설치 및 초기 설정
  3. 기본 개념
  4. 기본 명령어
  5. 브랜치 (Branch)
  6. 원격 저장소 (Remote Repository)
  7. 고급 기능
  8. 실무 워크플로우
  9. 문제 해결
  10. 유용한 팁

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

기본 개념

세 가지 영역

  1. Working Directory (작업 디렉토리): 현재 작업 중인 파일들
  2. Staging Area (스테이징 영역): 커밋할 준비가 된 파일들
  3. 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)부터 시작해서 점차 고급 기능들을 익혀나가면 됩니다.

추가 학습 자료:

기억할 점:

  • 자주 커밋하세요 (작은 단위로)
  • 의미 있는 커밋 메시지를 작성하세요
  • 브랜치를 적극 활용하세요
  • 팀의 Git 워크플로우를 따르세요