Git 커밋 워크플로
중요 규칙
- 커밋 전 검사: 항상
git diff .를 실행하여 커밋을 제안하거나 생성하기 전에 전체 작업 트리를 검토합니다. - 계획 먼저, 커밋은 나중에: 커밋 계획(파일 그룹, 근거, 제안 메시지)을 제시하고 명시적인 사용자 승인을 기다린 후
git commit을 실행합니다. - 논리적 변경으로 분할: 관련 없는 수정, 리팩터, 문서, 서식 변경 또는 생성된 파일을 혼합하지 말고 관심사별로 커밋을 분리합니다. 단, 사용자가 명시적으로 요청한 경우는 예외입니다.
- 대화형 명령어 사용 금지: 비대화형 Git 명령어만 사용합니다.
- 절대 권한을 가정하지 않음: '변경 사항 커밋' 요청을 검사 및 계획 권한으로만 간주하고,
git commit실행 권한으로 간주하지 않습니다.
워크플로
1단계 — 작업 트리 검사
git diff .
git status --short
git diff --cached # 스테이징된 변경 사항이 있는 경우에만
2단계 — 커밋 계획 제안
다음을 보여주는 표 또는 목록을 제시합니다.
- 그룹: 각 제안 커밋에 대한 파일 집합
- 근거: 이러한 파일들이 함께 속하는 이유
- 제안 커밋 메시지: 저장소에 맞는 올바른 스타일 사용 (아래 커밋 메시지 형식 참조)
3단계 — 승인 대기
계획을 제시한 후, AskQuestion 도구를 사용하여 승인을 받습니다. 항상 다음 옵션을 제공합니다.
Question: "이 커밋 계획을 진행할까요?"
Options:
- "승인 — 계획대로 커밋"
- "커밋 메시지 먼저 수정"
- "커밋 재그룹화"
- "취소"
사용자가 승인을 선택할 때까지 git commit을 실행하지 마십시오. 다른 선택은 계획을 수정하라는 요청으로 간주합니다.
4단계 — 승인된 커밋 실행
각 승인된 커밋에 대해 관련 파일만 스테이징하고 커밋합니다.
git add <file1> <file2> ...
git commit -s -m "type(scope): description"
필요할 경우 여러 줄 메시지에는 HEREDOC을 사용합니다.
git commit -s -m "$(cat <<'EOF'
type(scope): 짧은 요약
- 세부 사항 1
- 세부 사항 2
EOF
)"
커밋 메시지 형식
먼저 저장소 유형 감지
| 저장소 | 스타일 |
|---|---|
| 사용자 앱 저장소 (개인 프로젝트) | Conventional Commits |
zephyr/, nrf/, nrfxlib/, modules/ | Zephyr 스타일 |
사용자 앱 저장소 — Conventional Commits
類型(scope): 짧은 요약
일반 유형: feat, fix, refactor, docs, chore, test, style, build. 제목 ≤ 72자. 본문은 선택 사항이지만 중요하지 않은 변경 사항에는 유용합니다.
NCS / Zephyr 저장소 — Zephyr 스타일
[nrf tag] area: subarea: 짧은 요약
본문: 무엇을, 왜, 가정, 어떻게 검증되었는지 설명.
Upstream PR #: NNNNN (상류에서 포팅하는 경우)
Ref: NCSDK-XXXXX (내부 티켓을 추적하는 경우)
Assisted-by: Claude:claude-sonnet-4.6 (AI 지원인 경우)
Signed-off-by: 전체 이름 <email>
- 제목 ≤ 72자; 본문 필수 (비어 있지 않음) — 상류 PR의 경우 CI가 빈 본문을 거부합니다.
- 본문 줄 ≤ 75자
Signed-off-by:필수 (DCO) —git commit -s사용- NRF 접두사 태그:
[nrf fromlist](상류로),[nrf fromtree](상류에서),[nrf noup](NCS 전용),[nrf ncsdk](SDK 전용) - AI가 상당한 코드를 작성한 경우
Assisted-by:추가
예시:
[nrf fromlist] drivers: nrf_wifi: add WPA3-AUTO security type
The wpa_supplicant requires a dedicated key_mgmt enum value for
WPA3-AUTO mode. Without this, stations advertising both WPA2 and
WPA3 fail key exchange.
Upstream PR #: 106674
Signed-off-by: Your Name <[email protected]>
[nrf noup] tests: my_module: add unit test for zero-length buffer
Tests the boundary condition where input buffer length equals zero,
which previously triggered an assertion in the parser.
Ref: NCSDK-12345
Signed-off-by: Your Name <[email protected]>
그룹화 지침
| 변경 유형 | 별도 커밋? |
|---|---|
| 새 기능 코드 | 예 |
| 버그 수정 | 예 |
| 리팩터 (동작 변경 없음) | 예 |
| 설정 / Kconfig 변경 | 예 (또는 관련 기능과 함께) |
| 문서 / README | 예 (기능과 밀접하게 결합되지 않은 경우) |
| 서식 / 공백만 | 예 |
| 생성 / 자동 업데이트된 파일 | 예 |
| 보드 오버레이 + 관련 prj.conf | 함께 그룹화 가능 |
| Sysbuild 파일 | 논리적 목적별로 그룹화 |
NCS 특별 참고 사항
파일 그룹화:
prj.conf,boards/*.conf,overlay-*.conf— 활성화하는 기능과 함께 그룹화CMakeLists.txt변경 — 기능 추가의 일부가 아닌 경우 별도 커밋west.yml변경 — 항상 명확한 근거와 함께 별도 커밋sysbuild/파일 — 논리적 목적별로 그룹화 (예: mcuboot 설정 변경 함께)- 생성된 파티션 관리자 파일 (
pm/,*.map) — 별도의chore커밋 또는 의미 없는 경우 생략
NCS/Zephyr 저장소 (zephyr/, nrf/, nrfxlib/):
- Zephyr 스타일 사용 (위 참조), Conventional Commits 사용하지 않음
- 항상 비어 있지 않은 본문 포함 — CI가 상류 PR에 대해 빈 본문을 거부합니다.
git log -- <file>실행하여 동일한 서브시스템에 대한 다른 사람의 커밋 형식을 확인합니다.
단일 파일 내 변경 사항 분할
하나의 파일에 두 개 이상의 논리적으로 구분된 변경 사항이 포함되어 별도 커밋에 속하는 경우(예: 버그 수정 + 새로운 정책 섹션), 대화형 스테이징 없이 분할합니다.
- 파일에서 나중 섹션을 일시적으로 제거합니다(Python 또는 StrReplace 사용).
- 첫 번째 변경 사항을 스테이징하고 커밋합니다.
- 제거된 섹션을 복원합니다.
- 두 번째 변경 사항을 스테이징하고 커밋합니다.
MARKER = "\n## Self-Update Policy\n"
text = path.read_text()
path.write_text(text[:text.find(MARKER)]) # 나중 섹션 제거
# → git add + commit "fix: ..."
path.write_text(text) # 전체 내용 복원
# → git add + commit "feat: ..."
이유: git log -p <file>은 각 논리적 변경 사항을 자체 커밋에 표시하여 이분 탐색, 검토 또는 개별 되돌리기가 더 쉬워집니다.
주의점: 마커가 함수/블록 닫는 줄 앞에 있는지 항상 확인하십시오. 마커가 함수의 마지막 문장인 경우, 제거된 파일에 return과 }가 누락되어 expected declaration or statement at end of input 오류가 발생할 수 있습니다.
자체 업데이트 정책
각 대화가 끝날 때, 새로 발견된 사항을 검토하고 이 스킬의 어떤 사실이 새롭거나, 수정되었거나, 오래되었는지 확인합니다(예: 새로운 그룹화 패턴, NCS 파일 규칙, 커밋 메시지 규칙).
업데이트가 필요한 경우:
- 각 변경 사항에 대한 간략한 근거와 함께 모든 제안 변경 사항을 수집합니다.
- 사용자에게 요약을 제시하고
AskQuestion을 사용하여 승인을 요청합니다. - 승인된 업데이트를 이 파일에 즉시 적용합니다.
사용자가 명시적으로 요청하지 않는 한, 대화 중간에 이 스킬을 수정하지 마십시오.