git-subtree-dir: apps/web git-subtree-mainline:9212ed02acgit-subtree-split:5d65cbf2d5
124 lines
4.4 KiB
Markdown
124 lines
4.4 KiB
Markdown
---
|
|
name: commit-push
|
|
version: 1.0.0
|
|
description: 변경 사항을 커밋하고 원격에 푸시한다. "커밋해줘", "푸시해줘", "커밋하고 푸시" 요청 시 사용한다.
|
|
---
|
|
|
|
# commit-push
|
|
|
|
## 목적
|
|
|
|
현재 변경 내용을 분석하여 한국어 커밋 메시지를 작성하고, 커밋 및 푸시를 수행한다.
|
|
|
|
## 언제 호출할지
|
|
|
|
- "커밋해줘", "커밋하고 푸시해줘" 요청 시
|
|
- "변경 사항 올려줘", "푸시해줘" 요청 시
|
|
- 코드 작업 완료 후 "반영해줘", "올려줘" 요청 시
|
|
|
|
## 입력
|
|
|
|
- `scope`: 커밋 범위 — all(전체) 또는 특정 파일/경로 (선택, 기본값: all)
|
|
- `push`: 푸시 여부 (선택, 기본값: true)
|
|
|
|
## 먼저 확인할 것
|
|
|
|
- [ ] 커밋할 변경 사항이 존재하는가 (`git status`로 확인)
|
|
- [ ] 현재 브랜치가 올바른 브랜치인가
|
|
- [ ] `.env`, 시크릿 파일 등 민감한 파일이 스테이징에 포함되어 있지 않은가
|
|
|
|
## 실행 절차
|
|
|
|
1. **변경 사항 파악**
|
|
- `git status`로 변경/추가/삭제된 파일 목록을 확인한다
|
|
- `git diff`로 구체적인 변경 내용을 확인한다
|
|
- 변경 사항이 없으면 사용자에게 알리고 종료한다
|
|
|
|
2. **민감 파일 검사**
|
|
- 스테이징 대상에 아래 패턴이 포함되면 해당 파일을 제외하고 사용자에게 경고한다
|
|
- `.env`, `.env.*`
|
|
- `*secret*`, `*credential*`, `*password*`
|
|
- `*.pem`, `*.key`, `*.p12`
|
|
- `.gitignore`에 이미 등록된 파일은 무시한다
|
|
|
|
3. **커밋 메시지 작성**
|
|
- 변경 내용을 분석하여 한국어로 커밋 메시지를 작성한다
|
|
- 아래 메시지 규칙을 따른다
|
|
|
|
4. **사용자 확인**
|
|
- 커밋 메시지와 대상 파일 목록을 보여주고 승인을 받는다
|
|
- 사용자가 메시지 수정을 요청하면 반영한다
|
|
|
|
5. **커밋 실행**
|
|
- scope에 따라 파일을 스테이징한다
|
|
- all: 변경된 전체 파일을 개별적으로 `git add`
|
|
- 특정 경로: 해당 파일만 `git add`
|
|
- 승인된 메시지로 `git commit`을 실행한다
|
|
|
|
6. **푸시 실행**
|
|
- push가 true인 경우에만 실행한다
|
|
- 현재 브랜치를 원격에 푸시한다
|
|
- 원격 브랜치가 없으면 `-u origin {branch}`로 설정한다
|
|
- 충돌 발생 시 사용자에게 알리고 중단한다
|
|
|
|
7. **결과 보고**
|
|
- 커밋 해시, 메시지, 변경 파일 수, 푸시 결과를 출력한다
|
|
|
|
## 커밋 메시지 규칙
|
|
|
|
### 형식
|
|
|
|
```
|
|
<타입>: <변경 요약>
|
|
|
|
<본문> (선택)
|
|
```
|
|
|
|
### 타입 목록
|
|
|
|
| 타입 | 용도 |
|
|
|------|------|
|
|
| 기능 | 새로운 기능 추가 |
|
|
| 수정 | 버그 수정 |
|
|
| 개선 | 기존 기능 개선, 리팩토링 |
|
|
| 문서 | 문서 추가/수정 |
|
|
| 설정 | 빌드, CI/CD, 설정 파일 변경 |
|
|
| 테스트 | 테스트 추가/수정 |
|
|
| 정리 | 코드 정리, 불필요 코드 제거 |
|
|
|
|
### 작성 원칙
|
|
|
|
- **한국어**로 작성한다
|
|
- 요약은 50자 이내로 간결하게 작성한다
|
|
- 요약은 "~한다" 형태의 서술형으로 끝낸다 (예: "로그인 검증 로직을 추가한다")
|
|
- 본문은 **무엇을** 변경했는지가 아니라 **왜** 변경했는지를 쓴다
|
|
- 변경 파일이 3개 이하이면 본문을 생략할 수 있다
|
|
- 여러 성격의 변경이 섞여 있으면 가장 핵심적인 변경을 기준으로 타입을 정한다
|
|
|
|
## 출력 형식
|
|
|
|
```
|
|
## 커밋 완료
|
|
|
|
- 브랜치: {브랜치명}
|
|
- 커밋: {해시} — {커밋 메시지 요약}
|
|
- 변경 파일: {n}개
|
|
- {파일 경로}: {변경 유형}
|
|
- 푸시: {성공/생략/실패}
|
|
```
|
|
|
|
## 실행 결과 검증
|
|
|
|
- [ ] `git log -1`로 방금 생성한 커밋이 존재하고, 메시지가 승인된 내용과 일치하는가
|
|
- [ ] 커밋에 포함된 파일 목록이 의도한 scope와 일치하는가 (`git diff-tree --no-commit-id --name-only -r HEAD`)
|
|
- [ ] push가 true인 경우, `git status`에서 "Your branch is up to date" 또는 원격과 동기화 상태인가
|
|
- 검증 실패 시: 실패 원인(커밋 누락, 푸시 실패 등)을 사용자에게 알리고 재시도 여부를 확인한다
|
|
|
|
## 금지 사항
|
|
|
|
- `git add -A` 또는 `git add .`을 사용하지 않는다 (민감 파일 혼입 방지)
|
|
- `git push --force`를 사용하지 않는다
|
|
- 사용자 확인 없이 커밋하지 않는다
|
|
- 영어로 커밋 메시지를 작성하지 않는다
|
|
- 변경 내용과 무관한 커밋 메시지를 작성하지 않는다
|
|
- `--no-verify` 옵션을 사용하지 않는다
|