git · v1.0 · 2026-02-02 · sha256 4de57cf4382ffb6c
git v1.0A
Immutable. This exact content never changes and is served at /api/v1/blob/4de57cf4382ffb6c.
--- name: git description: "Git 버전 관리 모범 관례 및 워크플로우 가이드. 다음 상황에서 사용: (1) Git 커밋 메시지 작성 시 (Conventional Commits 규칙 적용), (2) 브랜치 생성 및 관리 시 (GitHub Flow 기반), (3) PR 생성 및 병합 전략 선택 시, (4) Git 히스토리 정리 작업 시 (rebase, squash, cherry-pick), (5) Merge conflict 해결 시, (6) 'git', '.git', 'commit', 'branch', 'merge', 'rebase' 키워드가 포함된 작업 시" license: MIT metadata: author: DaleStudy version: "1.0" allowed-tools: Bash(git:*) --- # Git Git 버전 관리 모범 관례 및 워크플로우 가이드. ## 커밋 메시지 컨벤션 ### Conventional Commits 사용 커밋 메시지는 `<type>: <description>` 형식을 따른다: ``` feat: 로그인 폼 검증 기능 추가 fix: 회원가입 시 이메일 중복 체크 오류 수정 docs: README에 설치 가이드 추가 refactor: 사용자 인증 로직 모듈화 test: 결제 기능 테스트 추가 chore: 의존성 버전 업데이트 ``` #### 주요 타입 | 타입 | 설명 | 예시 | | ---------- | ---------------------------------------- | ----------------------------------- | | `feat` | 새로운 기능 추가 | `feat: 다크모드 지원` | | `fix` | 버그 수정 | `fix: 로그아웃 시 토큰 미삭제 수정` | | `docs` | 문서 변경 (코드 변경 없음) | `docs: API 문서 업데이트` | | `style` | 코드 포맷팅, 세미콜론 누락 (동작 변경 X) | `style: ESLint 규칙 적용` | | `refactor` | 리팩토링 (기능 변경 없음) | `refactor: 유틸 함수 분리` | | `test` | 테스트 코드 추가/수정 | `test: 로그인 API 테스트 추가` | | `chore` | 빌드, 설정 변경 (src 변경 없음) | `chore: Webpack 설정 업데이트` | | `perf` | 성능 개선 | `perf: 이미지 지연 로딩 적용` | #### 상세 형식 (선택사항) ``` <type>(<scope>): <subject> <body> <footer> ``` 예시: ``` feat(auth): JWT 기반 인증 구현 - Access token과 refresh token 발급 - Redis를 통한 refresh token 저장 - 토큰 갱신 API 엔드포인트 추가 Closes #123 ``` #### 자주 하는 실수 ```bash # ❌ 타입 누락 git commit -m "버그 수정" # ❌ 모호한 설명 git commit -m "fix: 수정" # ❌ 한 커밋에 여러 작업 git commit -m "feat: 로그인, 회원가입, 비밀번호 찾기 구현" # ✅ 명확하고 단일 책임 git commit -m "feat: 로그인 폼 검증 기능 추가" ``` ### 커밋 메시지 작성 가이드라인 1. **첫 줄은 50자 이내** - 간결한 요약 2. **현재형 사용** - "추가했다" (X) → "추가" (O) 3. **명령형 어조** - "추가하세요" (X) → "추가" (O) 4. **첫 글자 대문자 금지** (한글 제외) - `Feat:` (X) → `feat:` (O) 5. **마침표 금지** - `feat: 기능 추가.` (X) → `feat: 기능 추가` (O) 6. **본문은 72자마다 줄바꿈** - 가독성 향상 7. **Why > What** - 변경한 내용보다 변경한 이유를 설명 ## GitHub Flow 워크플로우 ### 브랜치 전략 ``` main (항상 배포 가능한 상태) ├── feature/login-form ├── fix/payment-error └── refactor/user-service ``` #### 브랜치 네이밍 ```bash # 형식: <type>/<description> feature/user-authentication fix/header-layout-bug refactor/payment-module docs/api-documentation test/user-service chore/update-dependencies ``` ### 작업 흐름 ```bash # 1. main에서 최신 상태 받기 git checkout main git pull origin main # 2. 새 브랜치 생성 git checkout -b feature/dark-mode # 3. 작업 후 커밋 git add . git commit -m "feat: 다크모드 토글 버튼 추가" # 4. 원격 브랜치에 푸시 git push origin feature/dark-mode # 5. GitHub에서 PR 생성 gh pr create --title "feat: 다크모드 지원" --body "..." # 6. 코드 리뷰 후 main에 병합 (GitHub UI 또는 CLI) gh pr merge <PR번호> --squash # 또는 --merge, --rebase # 7. 로컬 main 업데이트 및 브랜치 삭제 git checkout main git pull origin main git branch -d feature/dark-mode ``` ### PR 병합 전략 | 전략 | 설명 | 언제 사용 | | ------------ | --------------------------------- | --------------------------- | | **Squash** | 모든 커밋을 하나로 합침 | 기능 브랜치 (권장) | | **Merge** | 병합 커밋 생성, 히스토리 보존 | 릴리스 브랜치 | | **Rebase** | 선형 히스토리 유지, 병합 커밋 X | 간단한 변경, 깔끔한 히스토리 | ```bash # Squash (권장 - 기능 단위로 커밋 정리) gh pr merge 123 --squash # Merge (히스토리 보존) gh pr merge 123 --merge # Rebase (선형 히스토리) gh pr merge 123 --rebase ``` ## Git 히스토리 관리 ### Rebase #### Interactive Rebase (커밋 정리) ```bash # 최근 3개 커밋 수정 git rebase -i HEAD~3 # 에디터에서 명령어 선택 # pick → 커밋 유지 # reword → 커밋 메시지 수정 # edit → 커밋 수정 # squash → 이전 커밋에 합침 # fixup → 이전 커밋에 합침 (메시지 제거) # drop → 커밋 삭제 ``` 예시: ```bash # Before pick a1b2c3d feat: 로그인 기능 pick d4e5f6g fix: 오타 수정 pick g7h8i9j fix: 변수명 수정 # After (squash 사용) pick a1b2c3d feat: 로그인 기능 fixup d4e5f6g fix: 오타 수정 fixup g7h8i9j fix: 변수명 수정 ``` #### Rebase onto main (브랜치 최신화) ```bash # 1. main 최신화 git checkout main git pull origin main # 2. feature 브랜치를 main 위로 rebase git checkout feature/my-feature git rebase main # 3. 충돌 발생 시 # - 파일 수정 후 git add . git rebase --continue # - rebase 취소하고 싶다면 git rebase --abort ``` ### Cherry-pick (특정 커밋만 가져오기) ```bash # 다른 브랜치의 커밋 하나만 적용 git cherry-pick <commit-hash> # 여러 커밋 적용 git cherry-pick <commit-hash1> <commit-hash2> # 충돌 발생 시 git add . git cherry-pick --continue ``` ### Commit Amend (마지막 커밋 수정) ```bash # 마지막 커밋 메시지만 수정 git commit --amend -m "fix: 수정된 커밋 메시지" # 마지막 커밋에 파일 추가 git add forgotten-file.ts git commit --amend --no-edit # ⚠️ 주의: 이미 push한 커밋은 amend 금지 (히스토리 변경됨) ``` ### Reset vs Revert ```bash # Reset - 커밋 취소 (히스토리 삭제) git reset --soft HEAD~1 # 커밋만 취소, 변경사항 유지 git reset --mixed HEAD~1 # 커밋 + staging 취소, 변경사항 유지 (기본값) git reset --hard HEAD~1 # 커밋 + 변경사항 모두 삭제 (위험!) # ⚠️ push한 커밋은 reset 금지 → revert 사용 # Revert - 커밋을 되돌리는 새 커밋 생성 (히스토리 보존) git revert <commit-hash> git revert HEAD # 마지막 커밋 되돌리기 ``` ## Merge Conflict 해결 ### Conflict 발생 시나리오 ```bash # main을 merge하거나 rebase할 때 충돌 발생 git merge main # 또는 git rebase main # Auto-merging src/index.ts # CONFLICT (content): Merge conflict in src/index.ts ``` ### Conflict 해결 과정 ```bash # 1. 충돌 파일 확인 git status # 2. 파일 열어서 수동 수정 # <<<<<<< HEAD (현재 브랜치) # 내 변경사항 # ======= # 상대 브랜치의 변경사항 # >>>>>>> main # 3. 마커 제거하고 코드 수정 # 4. 해결된 파일 staging git add src/index.ts # 5. Merge 완료 git merge --continue # 또는 Rebase 계속 git rebase --continue ``` ### Conflict 해결 전략 ```bash # 현재 브랜치 변경사항 우선 git checkout --ours <file> # 상대 브랜치 변경사항 우선 git checkout --theirs <file> # merge 취소 git merge --abort # rebase 취소 git rebase --abort ``` ## 자주 사용하는 명령어 ### 상태 확인 ```bash git status # 변경사항 확인 git log --oneline # 커밋 히스토리 (한 줄) git log --graph # 브랜치 그래프 git diff # 변경 내용 확인 git diff --staged # staging된 변경 내용 git show <commit-hash> # 특정 커밋 상세보기 ``` ### Stash (임시 저장) ```bash git stash # 현재 작업 임시 저장 git stash list # 저장된 stash 목록 git stash pop # 마지막 stash 적용 + 삭제 git stash apply # 마지막 stash 적용 (유지) git stash drop # 마지막 stash 삭제 git stash clear # 모든 stash 삭제 ``` ### 원격 저장소 ```bash git remote -v # 원격 저장소 확인 git fetch origin # 원격 변경사항 가져오기 (병합 X) git pull origin main # 원격 변경사항 가져오기 + 병합 git push origin main # 로컬 변경사항 푸시 git push -f origin main # 강제 푸시 (⚠️ 위험 - 팀 작업 시 금지) ``` ## 보안 및 주의사항 ### 절대 커밋하면 안 되는 파일 ```bash # .gitignore에 추가 .env # 환경 변수 (API 키, 비밀번호) .env.local *.key # 인증서 키 *.pem secrets/ # 시크릿 디렉토리 node_modules/ # 의존성 (package.json으로 관리) dist/ # 빌드 결과물 .DS_Store # macOS 시스템 파일 ``` ### 실수로 커밋한 시크릿 제거 ```bash # ⚠️ 히스토리에서 완전 삭제 (git filter-branch 대신 BFG 사용) brew install bfg bfg --delete-files .env git reflog expire --expire=now --all && git gc --prune=now --aggressive # ⚠️ 주의: 이미 푸시했다면 시크릿 즉시 폐기 후 재발급 필수 ``` ### Force Push 금지 (공유 브랜치) ```bash # ❌ main/develop에 force push 절대 금지 git push -f origin main # ✅ 개인 feature 브랜치에서만 허용 git push -f origin feature/my-branch ``` ## GitHub CLI 활용 ```bash # PR 생성 gh pr create --title "feat: 새 기능" --body "설명..." # PR 목록 확인 gh pr list # PR 상세보기 gh pr view 123 # PR 체크아웃 (로컬에서 테스트) gh pr checkout 123 # PR 병합 gh pr merge 123 --squash # Issue 생성 gh issue create --title "버그 발견" --body "설명..." ``` ## 추가 학습 자료 - [Conventional Commits](https://www.conventionalcommits.org/) - [GitHub Flow](https://docs.github.com/en/get-started/quickstart/github-flow) - [Pro Git Book (한글)](https://git-scm.com/book/ko/v2)