Search

Git Commit Message Convention

Base
분류
커밋/브랜치
적용 범위
공통
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 한다.