git-workflow
브랜치 전략, 커밋 컨벤션, 머지 vs 리베이스, 충돌 해결, 협업 개발 모범 사례를 포함하는 Git 워크플로 패턴. 모든 규모의 팀에 적용 가능하다.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
브랜치 전략, 커밋 컨벤션, 머지 vs 리베이스, 충돌 해결, 협업 개발 모범 사례를 포함하는 Git 워크플로 패턴. 모든 규모의 팀에 적용 가능하다.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
새 Spring Boot 서비스를 api-gateway + auth-api 에코시스템에 연결한다. auth-api 클라이언트 등록 → Gateway 라우팅 추가 → 서비스에 econo-passport 연동 → 동작 확인까지 한 번에 처리. 다음 상황에서 반드시 이 스킬을 사용한다: - "새 서비스 Gateway에 연결해줘", "새 서비스 auth 연동" - "서비스 등록해줘", "Gateway 뒤에 붙여줘" - "/register-service" 직접 호출 - 새 Spring Boot 서비스가 추가되고 인증이 필요할 때 ARGUMENTS: 서비스명, 서비스 경로(선택), 업스트림 URL(선택) 예: "EEOS-BE /Users/mando/study/eeos/EEOS-BE/eeos"
이 스킬은 사용자가 "PR 생성해줘", "PR 만들어줘", "pull request 생성", "pr 올려줘", "/git-pr" 등을 요청할 때 호출된다. 현재 브랜치의 커밋을 원격으로 push하고, `.github/PULL_REQUEST_TEMPLATE.md`를 채워 GitHub Pull Request를 생성한다.
신규 기능을 개발할 때 정책 문서 → 코드 → 테스트 순서로 작성한다. ADR은 기술적 결정에만 사용하고, 기능 정책은 docs/features/ 에 작성한다. 다음 상황에서 반드시 이 스킬을 사용한다: - "기능 추가해줘", "기획부터 해봐", "설계해봐" - 새로운 API 엔드포인트 또는 도메인 규칙이 생길 때 - "/new-feature" 직접 호출 ARGUMENTS: 기능 이름 또는 요구사항 (없으면 대화에서 추출)
Architecture Decision Record(ADR)를 작성한다. 기술적 결정사항, 설계 선택, 트레이드오프를 문서화하여 나중에 "왜 이렇게 했지?"를 알 수 있게 한다. 다음 상황에서 반드시 이 스킬을 사용한다: - "ADR 써줘", "결정사항 문서화해줘", "이 결정 기록해줘" - 기술 방향 선택 후 ("A 대신 B 쓰기로 했어") - 설계 논의가 끝났을 때 - 나중에 이 결정이 왜 내려졌는지 설명이 필요할 것 같을 때 - "/adr" 직접 호출 ARGUMENTS: 결정 내용 또는 결정 번호 (없으면 대화에서 추출)
AI 에이전트의 액션 스페이스, 도구 정의, 관측(Observation) 포맷을 설계·최적화해 작업 완수율을 높일 때 사용한다.
로컬 개발, 컨테이너 보안, 네트워킹, 볼륨 전략, 멀티 서비스 오케스트레이션을 위한 Docker 및 Docker Compose 패턴.
| name | git-workflow |
| description | 브랜치 전략, 커밋 컨벤션, 머지 vs 리베이스, 충돌 해결, 협업 개발 모범 사례를 포함하는 Git 워크플로 패턴. 모든 규모의 팀에 적용 가능하다. |
| origin | ECC |
Git 버전 관리, 브랜치 전략, 협업 개발을 위한 모범 사례.
연속 배포(continuous deployment) 환경과 중소 규모 팀에 적합.
main (보호됨, 항상 배포 가능)
│
├── feature/user-auth → PR → main으로 머지
├── feature/payment-flow → PR → main으로 머지
└── fix/login-bug → PR → main으로 머지
규칙:
main은 항상 배포 가능한 상태를 유지한다main에서 feature 브랜치를 분기한다main에 머지한다강력한 CI/CD와 피처 플래그를 갖춘 팀에 적합.
main (트렁크)
│
├── 단명 feature 브랜치 (최대 1~2일)
├── 단명 feature 브랜치
└── 단명 feature 브랜치
규칙:
main 또는 매우 짧은 브랜치에 커밋한다정해진 릴리스 일정과 엔터프라이즈 프로젝트에 적합.
main (운영 릴리스)
│
└── develop (통합 브랜치)
│
├── feature/user-auth
├── feature/payment
│
├── release/1.0.0 → main과 develop에 머지
│
└── hotfix/critical → main과 develop에 머지
규칙:
main은 운영 배포 가능한 코드만 포함한다develop은 통합 브랜치다develop에서 분기해 develop으로 머지한다develop에서 분기해 main과 develop으로 머지한다main에서 분기해 main과 develop 양쪽에 머지한다| 전략 | 팀 규모 | 릴리스 주기 | 적합한 환경 |
|---|---|---|---|
| GitHub Flow | 모든 규모 | 연속 배포 | SaaS, 웹 앱, 스타트업 |
| Trunk-Based | 숙련 5명 이상 | 하루 여러 번 | 고속 팀, 피처 플래그 활용 |
| GitFlow | 10명 이상 | 정해진 일정 | 엔터프라이즈, 규제 산업 |
<type>(<scope>): <subject>
[선택: 본문]
[선택: 푸터]
| 타입 | 사용 시점 | 예시 |
|---|---|---|
feat | 새 기능 | feat(auth): add OAuth2 login |
fix | 버그 수정 | fix(api): handle null response in user endpoint |
docs | 문서 | docs(readme): update installation instructions |
style | 포매팅, 코드 변경 없음 | style: fix indentation in login component |
refactor | 리팩터링 | refactor(db): extract connection pool to module |
test | 테스트 추가/수정 | test(auth): add unit tests for token validation |
chore | 유지보수 작업 | chore(deps): update dependencies |
perf | 성능 개선 | perf(query): add index to users table |
ci | CI/CD 변경 | ci: add PostgreSQL service to test workflow |
revert | 이전 커밋 되돌리기 | revert: revert "feat(auth): add OAuth2 login" |
# BAD: 모호하고 맥락이 없음
git commit -m "fixed stuff"
git commit -m "updates"
git commit -m "WIP"
# GOOD: 명확하고 구체적이며 이유까지 설명
git commit -m "fix(api): retry requests on 503 Service Unavailable
The external API occasionally returns 503 errors during peak hours.
Added exponential backoff retry logic with max 3 attempts.
Closes #123"
저장소 루트에 .gitmessage를 만든다:
# <type>(<scope>): <subject>
# # Types: feat, fix, docs, style, refactor, test, chore, perf, ci, revert
# Scope: api, ui, db, auth, etc.
# Subject: imperative mood, no period, max 50 chars
#
# [optional body] - explain why, not what
# [optional footer] - Breaking changes, closes #issue
활성화: git config commit.template .gitmessage
# 머지 커밋을 생성한다
git checkout main
git merge feature/user-auth
# 결과:
# * merge commit
# |\
# | * feature commits
# |/
# * main commits
사용 시점:
main에 머지할 때# feature 커밋을 대상 브랜치 위로 다시 작성한다
git checkout feature/user-auth
git rebase main
# 결과:
# * feature commits (재작성됨)
# * main commits
사용 시점:
main으로 업데이트할 때# PR 전에 feature 브랜치를 최신 main으로 업데이트
git checkout feature/user-auth
git fetch origin
git rebase origin/main
# 충돌이 있으면 해결한다
# 테스트는 여전히 통과해야 한다
# 강제 push (본인이 유일한 기여자일 때만)
git push --force-with-lease origin feature/user-auth
# 다음 브랜치는 절대 리베이스하지 않는다:
- 공유 저장소에 push된 브랜치
- 다른 사람이 그 위에서 작업한 브랜치
- 보호 브랜치(main, develop)
- 이미 머지된 브랜치
# 이유: 리베이스는 이력을 재작성하므로 다른 사람의 작업을 깨뜨린다
<type>(<scope>): <description>
예시:
feat(auth): add SSO support for enterprise users
fix(api): resolve race condition in order processing
docs(api): add OpenAPI specification for v2 endpoints
## What
이 PR이 무엇을 하는지 간단히 설명.
## Why
동기와 맥락 설명.
## How
강조할 만한 핵심 구현 디테일.
## Testing
- [ ] 단위 테스트 추가/수정
- [ ] 통합 테스트 추가/수정
- [ ] 수동 테스트 수행
## Screenshots (해당 시)
UI 변경의 전후 스크린샷.
## Checklist
- [ ] 코드가 프로젝트 스타일 가이드를 따른다
- [ ] 셀프 리뷰 완료
- [ ] 복잡한 로직에 주석 추가
- [ ] 문서 업데이트
- [ ] 새로운 경고 없음
- [ ] 로컬 테스트 통과
- [ ] 관련 이슈 링크
Closes #123
리뷰어:
작성자:
# 머지 전에 충돌 확인
git checkout main
git merge feature/user-auth --no-commit --no-ff
# 충돌이 있으면 Git이 다음과 같이 표시한다:
# CONFLICT (content): Merge conflict in src/auth/login.ts
# Automatic merge failed; fix conflicts and then commit the result.
# 충돌 파일 확인
git status
# 파일 내 충돌 마커
# <<<<<<< HEAD
# main의 내용
# =======
# feature 브랜치의 내용
# >>>>>>> feature/user-auth
# 옵션 1: 수동 해결
# 파일을 편집해 마커를 제거하고 올바른 내용을 남긴다
# 옵션 2: 머지 도구 사용
git mergetool
# 옵션 3: 한쪽을 통째로 채택
git checkout --ours src/auth/login.ts # main 버전 유지
git checkout --theirs src/auth/login.ts # feature 버전 유지
# 해결 후 스테이징 및 커밋
git add src/auth/login.ts
git commit
# 1. feature 브랜치를 작고 짧게 유지
# 2. main으로 자주 리베이스
git checkout feature/user-auth
git fetch origin
git rebase origin/main
# 3. 공유 파일을 건드릴 때 팀과 소통
# 4. 장수명 브랜치 대신 피처 플래그 사용
# 5. PR을 빠르게 리뷰·머지
# Feature 브랜치
feature/user-authentication
feature/JIRA-123-payment-integration
# 버그 수정
fix/login-redirect-loop
fix/456-null-pointer-exception
# 핫픽스 (운영 이슈)
hotfix/critical-security-patch
hotfix/database-connection-leak
# 릴리스
release/1.2.0
release/2024-01-hotfix
# 실험/PoC
experiment/new-caching-strategy
poc/graphql-migration
# 머지된 로컬 브랜치 삭제
git branch --merged main | grep -v "^\*\|main" | xargs -n 1 git branch -d
# 삭제된 원격 브랜치의 추적 참조 정리
git fetch -p
# 로컬 브랜치 삭제
git branch -d feature/user-auth # 안전 삭제 (머지된 경우만)
git branch -D feature/user-auth # 강제 삭제
# 원격 브랜치 삭제
git push origin --delete feature/user-auth
# 진행 중인 작업 저장
git stash push -m "WIP: user authentication"
# stash 목록
git stash list
# 가장 최근 stash 적용
git stash pop
# 특정 stash 적용
git stash apply stash@{2}
# stash 삭제
git stash drop stash@{0}
MAJOR.MINOR.PATCH
MAJOR: 호환되지 않는 변경
MINOR: 하위 호환되는 새 기능
PATCH: 하위 호환되는 버그 수정
예시:
1.0.0 → 1.0.1 (patch: 버그 수정)
1.0.1 → 1.1.0 (minor: 새 기능)
1.1.0 → 2.0.0 (major: 호환성 깨짐)
# 주석이 포함된 태그 생성
git tag -a v1.2.0 -m "Release v1.2.0
Features:
- Add user authentication
- Implement password reset
Fixes:
- Resolve login redirect issue
Breaking Changes:
- None"
# 태그를 원격에 push
git push origin v1.2.0
# 태그 목록
git tag -l
# 태그 삭제
git tag -d v1.2.0
git push origin --delete v1.2.0
# 커밋에서 changelog 생성
git log v1.1.0..v1.2.0 --oneline --no-merges
# 또는 conventional-changelog 사용
npx conventional-changelog -i CHANGELOG.md -s
# 사용자 정보
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
# 기본 브랜치 이름
git config --global init.defaultBranch main
# pull 동작 (merge 대신 rebase)
git config --global pull.rebase true
# push 동작 (현재 브랜치만 push)
git config --global push.default current
# 오타 자동 교정
git config --global help.autocorrect 1
# 더 나은 diff 알고리즘
git config --global diff.algorithm histogram
# 컬러 출력
git config --global color.ui auto
# ~/.gitconfig에 추가
[alias]
co = checkout
br = branch
ci = commit
st = status
unstage = reset HEAD --
last = log -1 HEAD
visual = log --oneline --graph --all
amend = commit --amend --no-edit
wip = commit -m "WIP"
undo = reset --soft HEAD~1
contributors = shortlog -sn
# 의존성
node_modules/
vendor/
# 빌드 산출물
dist/
build/
*.o
*.exe
# 환경 파일
.env
.env.local
.env.*.local
# IDE
.idea/
.vscode/
*.swp
*.swo
# OS 파일
.DS_Store
Thumbs.db
# 로그
*.log
logs/
# 테스트 커버리지
coverage/
# 캐시
.cache/
*.tsbuildinfo
# 1. main 브랜치 최신화
git checkout main
git pull origin main
# 2. feature 브랜치 생성
git checkout -b feature/user-auth
# 3. 변경 후 커밋
git add .
git commit -m "feat(auth): implement OAuth2 login"
# 4. 원격 push
git push -u origin feature/user-auth
# 5. GitHub/GitLab에서 Pull Request 생성
# 1. 추가 변경
git add .
git commit -m "feat(auth): add error handling"
# 2. 업데이트 push
git push origin feature/user-auth
# 1. upstream 원격 추가 (한 번만)
git remote add upstream https://github.com/original/repo.git
# 2. upstream fetch
git fetch upstream
# 3. upstream/main을 본인 main에 머지
git checkout main
git merge upstream/main
# 4. 본인 fork로 push
git push origin main
# 마지막 커밋 취소 (변경 유지)
git reset --soft HEAD~1
# 마지막 커밋 취소 (변경 폐기)
git reset --hard HEAD~1
# 원격에 push된 마지막 커밋 되돌리기
git revert HEAD
git push origin main
# 특정 파일 변경 되돌리기
git checkout HEAD -- path/to/file
# 마지막 커밋 메시지 수정
git commit --amend -m "New message"
# 빠뜨린 파일을 마지막 커밋에 추가
git add forgotten-file
git commit --amend --no-edit
#!/bin/bash
# .git/hooks/pre-commit
# 린트 실행
npm run lint || exit 1
# 테스트 실행
npm test || exit 1
# 시크릿 검사
if git diff --cached | grep -E '(password|api_key|secret)'; then
echo "Possible secret detected. Commit aborted."
exit 1
fi
#!/bin/bash
# .git/hooks/pre-push
# 전체 테스트 실행
npm run test:all || exit 1
# console.log 검출
if git diff origin/main | grep -E 'console\.log'; then
echo "Remove console.log statements before pushing."
exit 1
fi
# BAD: main에 직접 커밋
git checkout main
git commit -m "fix bug"
# GOOD: feature 브랜치 + PR 사용
# BAD: 시크릿 커밋
git add .env # API 키 포함
# GOOD: .gitignore에 추가, 환경 변수 사용
# BAD: 거대한 PR (1000줄 이상)
# GOOD: 작고 집중된 PR로 분할
# BAD: "Update" 같은 커밋 메시지
git commit -m "update"
git commit -m "fix"
# GOOD: 설명이 있는 메시지
git commit -m "fix(auth): resolve redirect loop after login"
# BAD: 공개된 이력 재작성
git push --force origin main
# GOOD: 공개 브랜치는 revert로 처리
git revert HEAD
# BAD: 장수명 feature 브랜치 (수 주~수 개월)
# GOOD: 브랜치를 짧게(며칠) 유지하고 자주 리베이스
# BAD: 생성 파일 커밋
git add dist/
git add node_modules/
# GOOD: .gitignore에 추가
| 작업 | 명령 |
|---|---|
| 브랜치 생성 | git checkout -b feature/name |
| 브랜치 전환 | git checkout branch-name |
| 브랜치 삭제 | git branch -d branch-name |
| 브랜치 머지 | git merge branch-name |
| 브랜치 리베이스 | git rebase main |
| 이력 조회 | git log --oneline --graph |
| 변경사항 보기 | git diff |
| 스테이징 | git add . 또는 git add -p |
| 커밋 | git commit -m "message" |
| Push | git push origin branch-name |
| Pull | git pull origin branch-name |
| Stash | git stash push -m "message" |
| 마지막 커밋 취소 | git reset --soft HEAD~1 |
| 커밋 revert | git revert HEAD |