# 커밋 메시지 규약

## 기본 형식

```
[<type>]: <공통 주제> - <개별 파일 내용>
```

| 항목 | 설명 | 예 |
|---|---|---|
| `type` | 변경 유형 | `feat` `fix` `refactor` `chore` `docs` `test` `perf` |
| 공통 주제 | 그 **작업 전체**를 가리키는 한 마디 | `스마트게이트 문자전송` |
| 개별 내용 | 이 커밋에서 실제로 한 일 | `목장 전화번호를 DB에서 읽도록 교체` |

## 핵심 — 한 작업을 쪼갤 때는 앞부분을 글자 하나까지 똑같이

한 작업을 파일별로 나눠 커밋하면 `git log` 에서 조각들이 흩어져 보입니다. **`[type]: 공통 주제 - ` 까지를 글자 하나까지 똑같이** 쓰면, 어디서 어디까지가 한 작업인지 한눈에 묶여 보입니다.

```
[fix]: 스마트게이트 문자전송 - 목장 전화번호를 DB에서 읽도록 교체
[fix]: 스마트게이트 문자전송 - 해소 통지는 텔레그램만 보내도록 변경
[fix]: 스마트게이트 문자전송 - 수신번호 스모크 테스트 추가
```

- 공통 주제를 커밋마다 조금씩 바꾸면 묶이지 않아 의미가 없습니다. 작업 내내 고정합니다.
- 파일 하나로 끝나는 단발 수정은 뒷부분을 생략해도 됩니다 — 묶을 대상이 없기 때문입니다.

```
[fix]: 세척설정 온도값 실수 표기
```

## type 종류

| 타입 | 의미 |
|---|---|
| `feat` | 기능 추가 |
| `fix` | 버그 수정 |
| `refactor` | 리팩터링 (동작 변화 없음) |
| `chore` | 빌드·설정·기타 |
| `docs` | 문서 |
| `test` | 테스트 |
| `perf` | 성능 개선 |

## 본문 — "무엇"보다 "왜"

제목 한 줄로 부족하면 본문에 **왜 그렇게 했는지**를 적습니다.

- 무엇을 바꿨는지는 diff 를 보면 알 수 있지만, **왜** 그렇게 했는지는 코드에 남지 않습니다.
- 사고 대응 커밋이면 **날짜·현상·근거(실측값)** 를 함께 남깁니다.
- 관련 이슈가 있으면 이슈 번호를 적습니다 ('이슈 기반 개발 흐름' 문서 참조).

```
[fix]: 세척설정 로봇 거부 알림 - 거부 시 즉시 전역 모달 표시

로봇이 세척설정 저장을 거부해도 화면에 아무 표시가 없어
운영자가 저장된 줄 알고 넘어가던 문제. (#123)
```

## 스테이징 — 명시한 경로만

커밋에는 **의도한 파일만** 넣습니다.

```bash
git add path/to/file1 path/to/file2   # O — 경로를 명시
git add -A                            # X — 의도하지 않은 파일(산출물·임시파일·비밀값)이 섞인다
```

> 왜 — 한꺼번에 추가하면 빌드 산출물, 로컬 설정, 비밀값이 든 파일이 함께 올라가는 사고가 납니다.

## 더 많은 예

```
[fix]: 세척설정 로봇 거부 알림 - 거부 시 즉시 전역 모달 표시
[fix]: 세척설정 로봇 거부 알림 - 거부 항목 취소선·「로봇 거부」 표시
[fix]: 세척설정 로봇 거부 알림 - 실측 MQTT 시험 스크립트 추가

[feat]: 급이현황 차트 - 착유 패널에 그래프 설정 연동
[refactor]: 밸브 기대값 보정 - SQL yield 컬럼 식별자 정리
```
