commitlint + @commitlint/config-conventional로 자동 검증되며, 형식이 어긋난 커밋은 push 전에 차단된다.
커밋 메시지 구조
<type>(<scope>?): <subject>
<body?>
<footer?>
Plain Text
복사
•
제목(header)과 본문(body)은 빈 줄 하나로 구분한다.
•
Header 최대 길이: 100자 (한국어 길이를 고려해 기본 72에서 확장).
•
가능하면 한 커밋에는 한 가지 변경만 담아 추적 가능성을 유지한다.
커밋 유형 <type>
모두 영문 소문자로 작성한다.
유형 | 의미 |
feat | 새 기능 |
fix | 버그 수정 |
chore | 빌드/도구/의존성 등 코드 외 변경 |
docs | 문서만 변경 |
refactor | 동작 변경 없는 리팩터링 |
test | 테스트 추가/변경 |
style | 코드 의미에 영향 없는 변경 (whitespace 등) |
perf | 성능 개선 |
ci | CI 설정 변경 |
build | 빌드 시스템 / 외부 의존성 변경 |
revert | 이전 커밋 되돌리기 |
범위 <scope> (선택)
•
변경이 속한 도메인/모듈을 소괄호로 표기한다. 예: feat(patrons), fix(mons).
제목 <subject>
•
한국어·영문 모두 허용 (commitlint subject-case: 0).
•
명령조·현재 시제로 작성한다.
•
끝에 마침표(.)를 붙이지 않는다.
본문 <body> (선택)
•
무엇(What) 과 왜(Why) 를 설명한다. 어떻게(How)보다 동기와 이전 코드와의 대조에 집중한다.
•
항목이 여러 개면 글머리 기호(-)로 가독성을 높인다.
푸터 <footer> & BREAKING CHANGE (선택)
•
호환성을 깨는 큰 변경은 type 뒤에 !를 붙이거나 푸터에 BREAKING CHANGE:를 명시한다.
•
semver 자동화: feat → minor, fix → patch, BREAKING CHANGE → major.
•
관련 이슈는 푸터에 연결한다. 예: Refs: #1, Closes #1.
예시
feat(patrons): OAuth 로그인 엔드포인트 추가
fix(mons): publicId 중복 시 409 응답 반환
chore: NestJS 11.1.21로 업데이트
docs(adr): Prisma 6 → 7 마이그레이션 노트 추가
refactor(eslint): eslint-plugin-import → eslint-plugin-import-x, ESLint 10 채택
Plain Text
복사
BREAKING CHANGE 예시:
feat!: 랭킹 점수 계산식 변경
기존 계산식은 `횟수 * 영상 시간(분)`이었지만, 기획 변경으로 `횟수 * 영상 시간(초)`로 변경되었습니다.
BREAKING CHANGE: 점수 계산 결과가 달라집니다.
Refs: #1
Plain Text
복사
Git Hooks 정책
•
--no-verify 사용은 원칙적으로 금지한다. 예외:
◦
머지 충돌 해결 커밋 (rebase 도중)
◦
긴급 hotfix로 lint 무시가 불가피한 경우 (별도 후속 PR로 정리)
•
pre-commit(Husky + lint-staged)이 스테이지된 파일만 lint·format 한다.
