커밋
커밋은 1년 후, 압박 속에서, 장애 상황에서 누군가가 읽게 될 역사의 최소 단위입니다. 그 독자를 위해 최적화하세요.
워크플로우
- 커밋 전에 확인:
git status,git diff --staged,git diff. 절대 눈감고 커밋하지 마세요. - 반드시 포함되지 말아야 할 사항이 있는지 확인: 자격 증명,
.env파일, 개인 키, 대용량 바이너리, 디버그 출력, 주석 처리된 코드. 발견되면 중단하고 사용자에게 알리세요.secrets-hygiene스킬을 참조하세요. - 의도적으로 스테이징하세요.
git add -A보다git add <paths>를 선호하세요. 하나의 논리적 변경당 하나의 커밋을 수행하고, diff에 리팩터링과 기능 추가가 섞여 있다면 분리하세요. - 아래 형식으로 메시지를 작성하세요.
- 여러 줄 본문이 셸에서 안전하게 유지되도록 히어독(heredoc)을 사용하여 커밋하세요:
git commit -m "$(cat <<'MSG'
feat(auth): add OIDC login for the admin console
Replaces the shared basic-auth password with Cognito-backed OIDC so
access can be revoked per user. Sessions expire after 8h.
Refs: PLAT-412
MSG
)"
git log -1 --stat으로 확인하세요. 사용자가 명시적으로 요청하지 않는 한 절대 수정(amend)하거나 강제 푸시(force-push)하지 마세요.
메시지 형식
<type>(<scope>): <명령형 요약, 72자 이하, 마침표 없음>
<이 변경이 존재하는 이유 — diff가 이미 보여주는 것이 아니라 왜 이 변경이 필요한지>
<푸터: Refs/Closes 티켓, BREAKING CHANGE: ..., Co-Authored-By>
Types: feat, fix, refactor, perf, test, docs, build, ci, chore, revert.
Scope는 수정한 모듈, 서비스 또는 스택(api, terraform/vpc, ci)입니다. 변경 사항이 전역적인 경우 생략합니다.
본문은 요약보다 중요합니다. "왜 지금?"과 "어떤 고려 사항이 있었는지?"를 2~4문장으로 답하세요. 사소한 변경의 경우 한 줄 커밋도 괜찮습니다.
예시
입력: S3 버킷에 태그가 없을 때 널 포인터 오류를 수정했습니다
출력: fix(s3-inventory): handle buckets with no tag set
입력: 테라폼 aws provider를 5.40에서 5.60으로 업그레이드했습니다. 새로운 람다 런타임 속성에 필요합니다 출력:
build(terraform): bump aws provider to 5.60
Required for `aws_lambda_function.runtime = "python3.13"`. No resource
diffs on `terraform plan` across all stacks.
$ARGUMENTS가 주어진 경우
사용자의 범위 또는 요약 힌트로 처리하지만, 여전히 diff를 검사하고 실제 변경 사항과 일치하지 않으면 수정하세요.