Git 커밋 메시지 컨벤션

한눈에 보기

커밋 메시지의 형식과 어휘를 통일하는 규칙을 다룬다. 제목, 본문, 꼬리말 구조와 컨벤셔널 커밋 타입 체계, commitlint와 husky로 컨벤션을 강제하는 방법까지 정리한다.

최종 업데이트 2026.09.17

Git 커밋 메시지 컨벤션은 커밋 메시지의 형식과 어휘를 팀 차원에서 통일하는 규칙이다. 잘 정리된 커밋 메시지는 코드 리뷰와 디버깅에서 변경 의도를 빠르게 파악하게 해 주고, 컨벤셔널 커밋(Conventional Commits)처럼 기계가 읽을 수 있는 형식을 따르면 체인지로그(changelog) 생성과 버전 관리까지 자동화할 수 있다. 핵심은 제목 한 줄로 무엇을 했는지 드러내고, 본문에서 왜 그렇게 했는지 설명하는 것이다.

커밋 메시지가 중요한 이유

커밋 메시지는 코드에 남길 수 없는 맥락을 기록하는 유일한 공식 통로다. 코드 자체는 무엇이 바뀌었는지 보여 주지만, 왜 그렇게 바꿨는지, 어떤 대안을 검토했다가 버렸는지는 보여 주지 못한다. 몇 달 뒤 git blame이나 git log로 이력을 추적할 때, 좋은 커밋 메시지는 당시의 의사 결정을 그대로 복원해 준다.

또한 커밋 단위가 잘 쪼개져 있고 메시지가 명확하면 리뷰어는 커밋을 따라가며 변경을 이해할 수 있고, 문제가 생겼을 때 git revert로 특정 변경만 안전하게 되돌릴 수 있다. 버그가 언제 유입되었는지 이분 탐색으로 찾아 주는 git bisect도 커밋이 논리적 단위로 나뉘어 있을 때 제 성능을 낸다. 반대로 "수정", "fix bug" 같은 메시지가 쌓이면 이력은 검색할 수 없는 잡음이 되고, 되돌리기와 원인 추적 모두 어려워진다.

좋은 커밋의 단위는 하나의 논리적 변경이다. 기능 추가와 무관한 포매팅 변경을 한 커밋에 섞으면 리뷰어가 실제 변경을 골라내기 어려워지므로, 관련 없는 변경은 커밋을 나누고 필요하면 git add -p로 파일의 일부만 스테이징해서 단위를 다듬는다.

메시지의 기본 구조

커밋 메시지는 제목(subject), 본문(body), 꼬리말(footer)의 세 부분으로 구성하며 각 부분은 빈 줄로 구분한다. 널리 통용되는 작성 규칙은 다음과 같다.

  • 제목은 50자 안팎으로 짧게 쓰고 끝에 마침표를 찍지 않는다.
  • 제목과 본문 사이에는 반드시 빈 줄을 하나 둔다. 많은 도구가 첫 줄만 요약으로 취급하기 때문이다.
  • 본문은 72자 정도에서 줄바꿈하고, 무엇을 왜 바꿨는지 설명한다. 어떻게 바꿨는지는 코드가 보여 주므로 반복하지 않는다.
  • 꼬리말에는 이슈 번호 참조나 호환성이 깨지는 변경(breaking change) 안내를 적는다.

영어로 쓸 때는 제목을 명령형 현재 시제로 쓰는 관례가 있다. "Added feature"가 아니라 "Add feature"로 쓰는데, 이는 "이 커밋을 적용하면 무엇을 한다"라는 문장으로 자연스럽게 읽히게 하기 위해서다. 한국어 팀이라면 "로그인 실패 시 재시도 로직 추가"처럼 명사형으로 끝내거나 팀이 정한 문체를 일관되게 유지하면 된다.

컨벤셔널 커밋과 타입 체계

컨벤셔널 커밋은 제목 앞에 변경의 성격을 나타내는 타입(type)을 붙이는 형식으로, 현재 가장 널리 쓰이는 컨벤션이다. 형식은 다음과 같다.

<type>(<scope>): <subject>

<body>

<footer>

# 예시
feat(auth): 소셜 로그인에 카카오 지원 추가

기존 OAuth 모듈이 제공자별 분기를 하드코딩하고 있어
전략 패턴으로 분리한 뒤 카카오 제공자를 추가했다.

Closes #123

자주 쓰는 타입은 다음과 같다.

타입의미예시
feat새로운 기능 추가feat: 비밀번호 재설정 메일 발송 추가
fix버그 수정fix: 토큰 만료 시 무한 리다이렉트 수정
refactor동작 변화 없는 구조 개선refactor: 결제 모듈을 서비스 계층으로 분리
docs문서 변경docs: README에 실행 방법 추가
test테스트 추가나 수정test: 주문 취소 경계 조건 테스트 추가
chore빌드, 설정 등 기타 잡무chore: eslint 규칙 갱신
perf성능 개선perf: 상품 목록 쿼리에 인덱스 적용

이 형식의 진짜 힘은 자동화에 있다. 타입을 기계적으로 파싱할 수 있으므로, feat은 마이너 버전, fix는 패치 버전을 올리는 유의적 버전(Semantic Versioning) 자동 릴리스나 체인지로그 자동 생성이 가능해진다. 제목에 느낌표를 붙이거나 꼬리말에 BREAKING CHANGE를 명시하면 메이저 버전 상승으로 이어진다.

컨벤션을 도구로 강제하기

컨벤션은 문서로만 존재하면 지켜지지 않으므로 도구로 강제하는 것이 좋다. Node.js 생태계에서는 커밋 시점에 훅(hook)을 실행해 주는 husky와 메시지 형식을 검사하는 commitlint 조합이 표준처럼 쓰인다.

npm install --save-dev husky @commitlint/cli @commitlint/config-conventional
npx husky init
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg

이렇게 설정하면 형식에 어긋나는 커밋은 로컬에서부터 거부된다. 도구 없이 가볍게 시작하려면 커밋 템플릿을 등록해서 커밋할 때마다 형식 안내가 보이게 할 수도 있다.

git config commit.template .gitmessage.txt

CI 단계에서 PR에 포함된 커밋 메시지를 검사하는 방법도 있다. 어느 쪽이든 중요한 것은 규칙을 사람의 기억이 아니라 자동화된 검증에 맡기는 것이다.

면접에서 이렇게 물어본다

  • 커밋 메시지 컨벤션이 왜 필요한지, 팀 생산성 관점에서 설명해 보라.
  • 컨벤셔널 커밋의 형식과 대표 타입을 설명하고, 이 형식이 릴리스 자동화와 어떻게 연결되는지 말해 보라.
  • 제목과 본문을 빈 줄로 구분하고 제목을 50자 내외로 쓰는 이유는 무엇인가.
  • 좋은 커밋의 단위는 어떻게 정하는가. 커밋을 잘게 쪼갤 때의 장점과 단점을 말해 보라.
  • 팀원들이 컨벤션을 지키지 않을 때 이를 강제할 수 있는 기술적 수단에는 무엇이 있는가.
Git과 협업 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기