자주 쓰는 커밋 컨벤션

기본 컨벤션

.github/.gitmessage.txt
################

# <타입>: <제목> (#이슈 번호) 의 형식으로 제목 작성
# 변경 사항이 "무엇"인지 명확히 작성 / 끝에 마침표 금지
# 예) feat: 마이페이지에 개인정보 수정 버튼 추가 (#15)

################

# 본문은 "어떻게" 보다 "무엇을", "왜"를 설명
# 여러 줄의 메시지를 작성할 땐 "-"로 구분

################
# feat      : 기능 (새로운 기능)
# fix       : 기능 수정 (기존 기능 개선, 사용성 향상을 위한 수정)
# bug       : 버그 수정 (오작동하는 기능 수정, 에러 해결 등)
# refactor  : 리팩토링 (기능은 같지만 코드를 개선)
# design    : UI/UX 변경 (CSS, 사용자 인터페이스 디자인 수정)
# style     : 코드 포맷팅, 세미콜론 누락 등 코드 변경이 없는 경우
# docs      : 문서 수정 (문서 추가, 수정, 삭제, README)
# test      : 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음)
# settings  : 프로젝트 세팅 관련
# chore     : 패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore
# init      : 초기 생성
# rename    : 파일 혹은 폴더명을 수정하거나 옮기는 작업만 한 경우
# remove    : 파일을 삭제하는 작업만 수행한 경우
# build     : 빌드 관련 변경 사항
# perf      : 성능 개선
# deploy    : 배포 관련
################txt

이모지 컨벤션

.github/.gitmessage.txt
################

# <타입> <제목> (#이슈 번호) 의 형식으로 제목 작성
# 변경 사항이 "무엇"인지 명확히 작성 / 끝에 마침표 금지
# 예) ✨ 마이페이지에 개인정보 수정 버튼 추가 (#15)

################

# 본문은 "어떻게" 보다 "무엇을", "왜"를 설명
# 여러 줄의 메시지를 작성할 땐 "-"로 구분

################
# ✨ feat      : 기능 (새로운 기능)
# 🔨 fix       : 기능 수정 (기존 기능 개선, 사용성 향상을 위한 수정)
# 🐛 bug       : 버그 수정 (오작동하는 기능 수정, 에러 해결 등)
# ♻️ refactor  : 리팩토링 (기능은 같지만 코드를 개선)
# 🎨 design    : UI/UX 변경 (CSS, 사용자 인터페이스 디자인 수정)
# 📏 style     : 코드 포맷팅, 세미콜론 누락 등 코드 변경이 없는 경우
# 📝 docs      : 문서 수정 (문서 추가, 수정, 삭제, README)
# ✅ test      : 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음)
# ⚙️ settings  : 프로젝트 세팅 관련
# 🧹 chore     : 패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore
# 🎉 init      : 초기 생성
# 🚚 rename    : 파일 혹은 폴더명을 수정하거나 옮기는 작업만 한 경우
# 🔥 remove    : 파일을 삭제하는 작업만 수행한 경우
# 📦 build     : 빌드 관련 변경 사항
# ⚡️ perf      : 성능 개선
# 🚀 deploy    : 배포 관련
################txt

템플릿 적용 방법

  • 커밋 컨벤션을 .gitmessage.txt(파일명은 원하는대로 수정 가능) 파일로 저장하고 git config로 설정
  • .gitmessage.txt 파일이 있는 경로에서 아래 명령 실행

프로젝트 단위로 템플릿 설정

git config commit.template .gitmessage.txt

설정 확인

git config --get commit.template

전역에 템플릿 설정

  • 경로를 .gitmessage.txt 파일이 있는 절대경로로 작성
git config --global commit.template /Users/(경로에 맞게 수정)/.gitmessage.txt

설정 확인

git config --global --get commit.template

CommitLint 설정

  • 커밋 메시지가 규칙에 맞는지 검사하는 도구
  • Lefthook이나 Husky 등의 패키지와 함께 사용하면 편리함

기본 컨벤션

commitlint.config.js
export default {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2,
      'always',
      [
        'feat',
        'fix',
        'bug',
        'refactor',
        'design',
        'style',
        'docs',
        'test',
        'settings',
        'chore',
        'init',
        'rename',
        'remove',
        'build',
        'perf',
        'deploy',
      ],
    ],
    'subject-empty': [2, 'never'],
    'type-case': [2, 'always', 'lower'],
    'type-empty': [2, 'never'],
    'subject-case': [0],
    'references-empty': [2, 'never'],
  },
  parserPreset: {
    parserOpts: {
      headerPattern: /^(\w*): (.+) \(#\d+\)$/,
      headerCorrespondence: ['type', 'subject', 'references'],
    },
  },
}js

이모지 컨벤션

commitlint.config.js
export default {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2,
      'always',
      [
        '✨',
        '🔨',
        '🐛',
        '♻️',
        '🎨',
        '📏',
        '📝',
        '✅',
        '⚙️',
        '🧹',
        '🎉',
        '🚚',
        '🔥',
        '📦',
        '⚡️',
        '🚀',
      ],
    ],
    'subject-empty': [2, 'never'],
    'type-empty': [2, 'never'],
    'subject-case': [0],
    'references-empty': [2, 'never'],
  },
  parserPreset: {
    parserOpts: {
      headerPattern: /^([\u{1F300}-\u{1F9FF}|[\u{2600}-\u{26FF}])\s+(.+?)(?:\s+\(#\d+\))?$/u,
      headerCorrespondence: ['type', 'subject', 'references'],
    },
  },
}js

옵션

2는 error, 1은 warning, 0은 disable을 의미

  • type-enum: 커밋 타입 제한
  • 'subject-empty': [2, 'never']: 제목 필수
  • 'type-case': [2, 'always', 'lower']: 타입은 소문자만
  • 'type-empty': [2, 'never']: 타입 필수
  • 'subject-case': [0]: 제목 케이스 스타일 제한 없음
  • 'references-empty': [2, 'never']: 이슈 번호 필수