🔧 DevOps

Git

Git Version Control

분산 버전 관리 시스템. 브랜치, 머지, 커밋으로 소스 코드 변경 이력을 추적. GitHub, GitLab과 함께 사용.

상세 설명

Git은 2005년 리누스 토르발스가 Linux 커널 개발을 위해 만든 분산 버전 관리 시스템(DVCS)입니다. 파일의 변경 이력을 추적하고, 여러 개발자가 동시에 작업할 수 있게 해주며, 현재 전 세계적으로 가장 널리 사용되는 소스 코드 관리 도구입니다.

핵심 개념

  • Repository(저장소): 프로젝트의 파일과 변경 이력을 담는 공간
  • Commit: 파일 변경사항의 스냅샷. 고유한 SHA-1 해시로 식별
  • Branch: 독립적인 개발 라인. 기능 개발이나 버그 수정을 격리
  • Merge: 분기된 브랜치를 다시 합치는 작업
  • Remote: 원격 저장소(GitHub, GitLab 등)
  • Clone: 원격 저장소의 전체 복사본 생성

Git의 세 가지 영역

  • Working Directory: 실제 파일이 있는 작업 공간
  • Staging Area(Index): 커밋 대기 영역
  • Repository(.git): 커밋된 스냅샷 저장소

코드 예제

기본 Git 워크플로우

# 저장소 초기화 또는 복제
git init my-project
git clone https://github.com/user/repo.git

# 상태 확인
git status
git log --oneline --graph

# 파일 스테이징 및 커밋
git add .                           # 모든 변경사항 스테이징
git add src/app.js                  # 특정 파일만 스테이징
git commit -m "feat: 로그인 기능 추가"

# 원격 저장소 연동
git remote add origin https://github.com/user/repo.git
git push -u origin main
git pull origin main

# 변경사항 확인
git diff                            # Working vs Staging
git diff --staged                   # Staging vs Last Commit
git diff main..feature-branch       # 브랜치 간 비교

브랜치 작업

# 브랜치 생성 및 전환
git branch feature/login            # 브랜치 생성
git checkout feature/login          # 브랜치 전환
git checkout -b feature/login       # 생성과 전환을 동시에
git switch -c feature/login         # Git 2.23+ 새로운 명령어

# 브랜치 목록
git branch                          # 로컬 브랜치
git branch -r                       # 원격 브랜치
git branch -a                       # 모든 브랜치

# 브랜치 병합
git checkout main
git merge feature/login             # feature/login을 main에 병합
git merge --no-ff feature/login     # fast-forward 방지

# 브랜치 삭제
git branch -d feature/login         # 병합된 브랜치 삭제
git branch -D feature/login         # 강제 삭제
git push origin --delete feature/login  # 원격 브랜치 삭제

되돌리기 및 수정

# 스테이징 취소
git restore --staged file.js        # Git 2.23+
git reset HEAD file.js              # 이전 방식

# 작업 변경사항 버리기
git restore file.js                 # Git 2.23+
git checkout -- file.js             # 이전 방식

# 마지막 커밋 수정
git commit --amend -m "새 메시지"   # 메시지 수정
git commit --amend --no-edit        # 파일만 추가

# 커밋 되돌리기
git revert HEAD                     # 새 커밋으로 되돌림 (안전)
git reset --soft HEAD~1             # 커밋 취소, 스테이징 유지
git reset --mixed HEAD~1            # 커밋 취소, 스테이징도 취소
git reset --hard HEAD~1             # 모든 변경사항 삭제 (주의!)

Rebase 및 고급 기능

# Rebase - 커밋 히스토리 정리
git checkout feature
git rebase main                     # feature를 main 위로 이동

# Interactive Rebase - 커밋 편집
git rebase -i HEAD~3                # 최근 3개 커밋 편집
# pick, squash, reword, edit, drop 옵션 사용

# Cherry-pick - 특정 커밋만 가져오기
git cherry-pick abc1234

# Stash - 임시 저장
git stash                           # 변경사항 임시 저장
git stash pop                       # 복원
git stash list                      # 목록
git stash drop                      # 삭제

# 특정 파일 히스토리
git log --follow -p -- src/app.js

# 누가 수정했는지 확인
git blame src/app.js

.gitignore 예제

# .gitignore
# Node.js
node_modules/
npm-debug.log
.env
.env.local

# Build
dist/
build/
*.min.js

# IDE
.idea/
.vscode/
*.swp

# OS
.DS_Store
Thumbs.db

# 예외
!.gitkeep
!important-file.env.example

실무 대화 예제

주니어 개발자
"main 브랜치에 직접 푸시했다가 코드 리뷰를 못 받았어요. 이미 커밋한 걸 어떻게 하죠?"
시니어 개발자
"다른 사람이 이미 pull 했으면 force push는 위험해요. `git revert HEAD`로 새 커밋을 만들어서 롤백하고, 나중에 feature 브랜치에서 다시 작업해서 PR 올리세요."
주니어 개발자
"revert랑 reset의 차이가 뭐예요?"
시니어 개발자
"revert는 이전 커밋의 반대 변경을 새 커밋으로 추가해요. 히스토리가 보존되고 협업에 안전하죠. reset은 히스토리를 직접 수정해서, 이미 공유된 브랜치에서 쓰면 다른 사람 저장소와 꼬일 수 있어요."

주의사항

Force Push 금지

공유된 브랜치(main, develop)에 `git push --force`를 사용하면 다른 팀원의 작업이 유실될 수 있습니다. `--force-with-lease` 옵션이 더 안전합니다.

민감 정보 커밋 금지

비밀번호, API 키 등을 커밋하면 히스토리에 영구 기록됩니다. 삭제해도 복구 가능하므로, 노출 시 즉시 키를 교체하세요.

대용량 파일 주의

Git은 대용량 바이너리 파일에 적합하지 않습니다. 영상, 빌드 결과물은 Git LFS(Large File Storage)를 사용하세요.

커밋 메시지 컨벤션

일관된 커밋 메시지 형식(Conventional Commits)을 사용하면 자동화된 변경 로그 생성과 버전 관리가 쉬워집니다.

더 배우기