# Git Teacher Save

> Commits changed files to Git, explained in plain language for non-developers. Runs `git add -A` + `git commit` and describes what was saved. Korean triggers — "저장해줘", "커밋", "커밋해줘", "변경 내용 저장", "지금까지 한 거 저장", "세이브". English triggers — "save", "commit", "save my work".

- Skill: `fivetaku/git-teacher-save` (Agent Skill)
- Install (CLI): `npx skillmds@latest add fivetaku/git-teacher-save`
- Raw SKILL.md: https://api.skillmd.com/api/skills/fivetaku/git-teacher-save/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: fivetaku (https://skillmd.com/u/fivetaku)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/fivetaku/git-teacher-save

---


# 저장하기 — Phase 3 (바르다 깃선생 — Codex)

변경된 파일을 Commit (저장)한다. `git add -A` + `git commit`을 실행하고, 사후에 무엇을 했는지 설명한다.

> 설명·교육 시 `git-teacher-help`의 §교육 원칙(`shared/questioning-policy.md` §3 Teaching)을 따른다. "Commit하면 GitHub에 올라간다"는 오개념은 비유+질문으로 교정한다(§2a). 사용자가 그냥 저장만 빨리 원하면 강의하지 않는다(§2c).
> Codex CLI에는 객관식 카드 UI가 없다. 결정이 필요한 곳은 `shared/questioning-policy.md` §A의 **채팅 번호형 선택지 블록**으로 묻는다.

## 실행 순서

### Step 1: 병렬 상태 수집

다음 명령을 **병렬로(가능한 한 함께)** 실행한다:

```bash
git rev-parse --is-inside-work-tree    # .git 존재 확인
git symbolic-ref --short HEAD          # 현재 branch
git status --porcelain                 # 변경 파일 목록
git diff --stat                        # 변경 통계
ls .gitignore 2>/dev/null              # .gitignore 존재 여부
```

### Step 2: 안전 검사

1. **`.git` 없음**: "여기는 Git 프로젝트 폴더가 아니에요. '깃 시작해줘'로 먼저 설정하세요." → 중단
2. **Detached HEAD**: "안전한 위치에서 벗어났어요." → `git checkout main` 실행 후 재시도
3. **Merge Conflict** (`UU`, `AA` 등): 충돌 파일 목록을 보여주고, 채팅 번호형 선택지로 묻는다 (`shared/questioning-policy.md` §A):
   ```text
   충돌이 있어서 바로 저장할 수 없어요. 두 사람이 같은 부분을 동시에 고쳤거든요.
   충돌 파일: {파일 목록}

   질문: 어떻게 할까요?
   1. 내가 수정한 걸로 유지 — 내 변경 내용을 사용해요
   2. 상대방이 수정한 걸로 유지 — 상대방의 변경 내용을 사용해요
   3. 문장으로 직접 수정 요청
   ```
   선택에 따라:
   - "내가 수정한 걸로 유지": `git checkout --ours {파일}` → `git add {파일}`
   - "상대방이 수정한 걸로 유지": `git checkout --theirs {파일}` → `git add {파일}`
   충돌 해결 후 자동으로 저장(commit) 단계로 진행한다.
4. **변경 사항 없음**: "저장할 변경 사항이 없어요. 파일을 수정한 뒤 다시 시도하세요." → 중단

### Step 3: .gitignore 자동 생성

`.gitignore`가 없으면 프로젝트 타입을 감지하여 기본 `.gitignore`를 생성한다:

- Node.js (`package.json` 존재) → `node_modules/`, `.env`, `dist/` 등
- Python (`requirements.txt` 또는 `pyproject.toml` 존재) → `__pycache__/`, `.env`, `venv/` 등
- 일반 → `.env`, `.DS_Store`, `*.log`, `thumbs.db` 등

생성 후 안내: "보안을 위해 .gitignore 파일을 만들었어요. 비밀번호나 임시 파일은 자동으로 제외됩니다."

### Step 4: 변경 파일 안내 + 커밋 메시지 요청

변경된 파일 목록을 보여준 뒤 커밋 메시지를 물어본다.

`git status --porcelain` 결과로 파일 목록을 **동적 생성**하여 먼저 보여주고, 채팅 번호형 선택지로 묻는다 (`shared/questioning-policy.md` §A):

```text
변경된 파일 N개:
  - file1 (수정됨)
  - file2 (새 파일)

질문: 뭘 바꿨는지 한 줄로 적어주세요.
1. 직접 입력 — 한 줄로 알려주세요 (예: "로고 변경", "메인 페이지 수정")
2. 자동 생성 — 변경 내용을 분석해서 메시지를 자동으로 만들어요
3. 문장으로 직접 수정 요청
```

**사용자가 빈 값이나 애매한 답을 주면**: 변경 내용(diff)을 분석하여 짧은 자연어 메시지를 자동 생성한다.

### Step 5: 저장 실행

```bash
git add -A
git commit -m "사용자가 입력한 메시지"
```

커밋 메시지 규칙:
- 사용자가 입력한 자연어 그대로 사용 (conventional commits 강제하지 않음)
- 한국어/영어 모두 허용
- 예: "로고 변경", "메인 페이지 수정", "오타 고침"

### Step 6: 영수증 출력

실행 후 결과를 알려준다:

```
저장 완료! 파일 3개를 포장해서 '로고 변경'이라고 기록했어요.

아직 내 컴퓨터에만 있어요.
GitHub 클라우드에도 올리려면 "올려줘"라고 하세요.
```

## 핵심 강조사항

- 저장 후 **매번** "아직 내 컴퓨터에만 있어요" 리마인드
- Commit과 Push의 차이를 체감하게 함 — 겁먹은 초보면 "방금 저장한 건 어디에 있는 걸까요?"로 한 번 더 확인(§2a)
- 다음 행동(Push)을 안내

## Safety

- `git reset --hard` 같은 파괴적 명령은 절대 실행하지 않는다.
- 사용자가 명시적으로 요청하지 않으면 히스토리를 재작성하지 않는다.
- 사용자의 무관한 변경 내용은 그대로 보존한다.

