참고 : https://udacity.github.io/git-styleguide/
커밋 메시지는 세 부분으로 구성됨 (빈 줄로 구분):
type: Subject
body
footer
type: subject.) 쓰지 않음이슈 트래커 ID 참조 용도
예시:
Resolves: #123
See also: #456, #789
feat: Summarize changes in around 50 characters or less
More detailed explanatory text, if necessary. Wrap it to about 72
characters or so. Explain what and why, not how.
- Bullet points are fine
- Keep lines wrapped to 72 characters
Resolves: #123
See also: #456
type: Subject
body
footer
Resolves: #123, Related to: #45)영어면 동사원형(명령형: Add/Change/Fix), 한글이면 “추가/변경/고침” 같은 개조식 표현 추천.
| 태그(글의 용례) | 의미 | Conventional Commits 대응 |
|---|---|---|
| Feat | 새 기능 추가 | feat |
| Fix | 버그 수정 | fix |
| Design | UI/CSS 변경 | 보통 style 또는 feat(사용자 기능 변화면) |
| !BREAKING CHANGE | 호환성 깨짐 | feat! 또는 본문/푸터에 BREAKING CHANGE: |
중요: “큰 변경”은 제목에
feat!:처럼 느낌표 또는 푸터/본문에BREAKING CHANGE:로 남기는 게 표준적입니다.
| 태그 | 의미 | Conventional Commits |
|---|---|---|
| Style | 포맷/세미콜론/공백 등, 로직 변화 없음 | style |
| Refactor | 리팩토링(기능 변화 없음) | refactor |
| Comment | 주석 추가/변경 | 보통 docs 또는 chore (코드 주석은 style로 보는 팀도) |
| 태그 | 의미 | Conventional Commits |
|---|---|---|
| Docs | 문서 변경(README 등) | docs |
| Test | 테스트 추가/수정(프로덕션 미변경) | test |
| Chore | 빌드/도구/패키지/환경 변경 | chore |
| Rename | 파일/폴더명 변경만 | chore (또는 refactor로 보는 팀도) |
| Remove | 파일/폴더 삭제만 | chore 또는 refactor |
| 태그 | 의미 | Conventional Commits |
|---|---|---|
| !HOTFIX | 치명적 이슈 긴급 수정 | 보통 fix(필요하면 fix!) |
팀 내 허용 태그 목록을 짧게 유지하는 게 좋습니다. (예:
feat, fix, docs, style, refactor, test, chore+ 필요 시perf,ci)
50자 이내, 마침표 X, 명령형 (“추가/변경/수정/고침…”)
영어면 첫 글자 대문자 + 동사원형(“Add”, “Change”, “Fix”)
괄호로 범위를 표기해 문맥 제공 가능
feat(auth): JWT 로그인 추가, fix(db): NPE 방지이슈 연결:
Resolves: #123 (머지 시 자동 종료)Fixes: #45 (유사)Related to: #34, #23 (참조)Ref: #456 (참고)호환성 파괴 공지는 여기에도 가능:
BREAKING CHANGE: 토큰 필드명이 변경되어 클라이언트 수정 필요feat(auth): 로그인 API 추가
사용자 이메일/비밀번호로 인증 후 JWT를 발급합니다.
비밀번호는 bcrypt 해시 검증, 실패 시 401을 반환합니다.
토큰 만료는 30분이며 갱신 엔드포인트는 추후 추가 예정.
Resolves: #123
Related to: #48, #45
호환성 파괴 예시
feat!(auth): 로그인 응답 스키마 변경
기존 token → accessToken으로 필드명 변경.
클라이언트 파싱 로직 업데이트 필요.
BREAKING CHANGE: 응답 필드명이 변경되었습니다.
✨ feat: 새 기능, 🐛 fix: 버그, 📝 docs: 문서, 🎨 style: 포맷나쁜 예: 수정, 고침, fix, Update, 잡다한 수정
좋은 예:
fix(order): 결제 시 NPE 발생 원인 제거refactor(user): 서비스 레이어 의존성 정리docs(readme): 실행 방법 및 환경 변수 표 추가허용 타입 목록 간결화 + BREAKING CHANGE 통일 규칙(제목 ! 또는 푸터)
커밋 템플릿으로 습관화:
git config --global commit.template ~/.gitmessage.txt
~/.gitmessage.txt 예:
type(scope): subject (≤50)
body (what & why, wrap at 72)
Resolves: #123
Related to: #456
BREAKING CHANGE:
잘된 예
feat(auth): 이메일 기반 회원가입 API 추가
사용자가 이메일과 비밀번호로 가입할 수 있도록 엔드포인트를 추가했습니다.
비밀번호는 bcrypt 해시를 사용하며 중복 이메일은 400을 반환합니다.
Resolves: #12
나쁜 예
회원가입 구현
feat: 회원가입 기능
-> 문제: 너무 포괄적/불명확, 왜/무엇을 추가했는지 설명 없음
잘된 예
fix(order): 결제 시 null pointer exception 수정
결제 요청 시 배송지 주소가 null일 경우 발생하는 NPE를 방지했습니다.
기본 배송지 로직을 추가해 null 검증 후 처리합니다.
Resolves: #45
나쁜 예
고침
버그 수정
-> 문제: 어떤 버그인지, 어떻게 해결했는지 알 수 없음
잘된 예
refactor(user): 서비스 레이어 의존성 정리
UserService에서 직접 DB 접근하던 코드를 Repository 계층으로 이동했습니다.
서비스 책임을 분리하고 테스트 가능성을 개선했습니다.
나쁜 예
코드 정리
-> 문제: 무엇을 정리했는지 추적 불가
잘된 예
docs(readme): 실행 방법과 환경 변수 설정 가이드 추가
나쁜 예
README 수정
-> 문제: 어떤 내용이 바뀌었는지 불명확
잘된 예
style(lint): Prettier 규칙에 따라 코드 포맷 적용
나쁜 예
오타 고침
-> 문제: 오타/스타일의 범위, 이유 불분명