- name
- git-teacher-review
- description
- Automated review request workflow โ handles branch creation, commit, push, and PR creation as one step. Hides Git branch jargon from users and presents it as "a safe workspace to show your teammates." Korean triggers โ "PR ๋ง๋ค์ด์ค", "๊ฒํ ์์ฒญ", "๋ฆฌ๋ทฐ ์์ฒญ", "์์ ์ ์", "ํ์ํํ
๋ณด์ฌ์ฃผ๊ณ ์ถ์ด", "ํ์ธ ์์ฒญ". English triggers โ "create PR", "pull request", "request review", "show teammates".
# ๊ฒํ ์์ฒญํ๊ธฐ โ Phase 5 (๋ฐ๋ฅด๋ค ๊น์ ์ โ Codex)
Branch ์์ฑ โ Commit โ Push โ PR ์์ฑ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค. Branch ๊ฐ๋
์ ์ฌ์ฉ์์๊ฒ ์จ๊ธฐ๊ณ "์์ ํ ์์
๊ณต๊ฐ"์ผ๋ก ์ค๋ช
ํ๋ค.
> ์ค๋ช
ยท๊ต์ก ์ `git-teacher-help`์ ยง๊ต์ก ์์น(`shared/questioning-policy.md` ยง3 Teaching)์ ๋ฐ๋ฅธ๋ค. "๊ฒํ ์์ฒญ(PR)"์ Google Docs "์์ ์ ์" ๋ชจ๋ ๋น์ ๋ก ์ค๋ช
ํ๋ค. ๊ฒ๋จน์ ์ด๋ณด๋ฉด ์์ท ๊ธ์ง(ยง2a), ๊ทธ๋ฅ PR๋ง ์ํ๋ฉด ๊ฐ์ ์์ด ์งํ(ยง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 (detached HEAD ๊ฐ์ง)
git status --porcelain # ๋ณ๊ฒฝ ํ์ผ ๋ชฉ๋ก
git rev-list --count @{u}..HEAD 2>/dev/null || git rev-list --count HEAD 2>/dev/null # ์ฌ๋ฆฌ์ง ์์ commit ์ (upstream ์์ผ๋ฉด ์ ์ฒด commit ์๋ก ๋์ฒด)
git remote get-url origin 2>/dev/null # ์๊ฒฉ ์ ์ฅ์ URL
gh auth status 2>&1 # GitHub CLI ๋ก๊ทธ์ธ ์ํ
```
### Step 2: ์์ ๊ฒ์ฌ
1. **`.git` ์์**: "์ฌ๊ธฐ๋ Git ํ๋ก์ ํธ ํด๋๊ฐ ์๋์์. '๊น ์์ํด์ค'๋ก ๋จผ์ ์ค์ ํ์ธ์." โ ์ค๋จ
2. **Detached HEAD**: "์์ ํ ์์น์์ ๋ฒ์ด๋ฌ์ด์. ์๋์ผ๋ก ๋์๊ฐ๊ฒ์." โ `git checkout main` (๋๋ `master`) ์คํ ํ ์ฌ์๋
3. **์๊ฒฉ ์ ์ฅ์ ์์**: "GitHub์ ์ฐ๊ฒฐ๋์ด ์์ง ์์์. '๊น ์์ํด์ค'๋ก ๋จผ์ ์ค์ ํ์ธ์." โ ์ค๋จ
4. **gh ๋ฏธ๋ก๊ทธ์ธ**: "GitHub CLI์ ๋ก๊ทธ์ธ๋์ด ์์ง ์์์. '๊น ์์ํด์ค'๋ก ์ค์ ํ์ธ์." โ ์ค๋จ
5. **Merge Conflict** (`UU`, `AA` ๋ฑ ๊ฐ์ง ์): ์ถฉ๋ ํด๊ฒฐ ์๋ด (์๋ "์ถฉ๋ ํด๊ฒฐ" ์น์
์ฐธ์กฐ) โ ์ค๋จ
6. **๋ณ๊ฒฝ ์ฌํญ ํ๋จ**: ์๋ ๋ ์กฐ๊ฑด์ **๋ชจ๋** ํ์ธํ๋ค:
- `git status --porcelain` ๊ฒฐ๊ณผ (์์ ๋ ํ์ผ ์กด์ฌ ์ฌ๋ถ)
- `git rev-list --count @{u}..HEAD` ๊ฒฐ๊ณผ (์ฌ๋ฆฌ์ง ์์ commit ์กด์ฌ ์ฌ๋ถ; upstream ๋ฏธ์ค์ ์ ์ ์ฒด commit ์๋ก ๋์ฒด)
- ๋ ๋ค ๋น์ด์์ผ๋ฉด: "๋ณ๊ฒฝ๋ ํ์ผ๋ ์๊ณ , ์ฌ๋ฆฌ์ง ์์ ์ ์ฅ๋ ์์ด์. ํ์ผ์ ์์ ํ ๋ค ๋ค์ ์๋ํ์ธ์." โ ์ค๋จ
- ์์ ๋ ํ์ผ์ ์์ง๋ง ๋ฏธ์ ์ก commit์ด ์์ผ๋ฉด: ์ด๋ฏธ ์ ์ฅ(save)๋ ๋ด์ฉ์ผ๋ก PR ์งํ (Step 5์์ commit ์คํต)
7. **์ด๋ฏธ main/master๊ฐ ์๋ branch์ ์์**: ํ์ฌ branch์์ ๊ทธ๋๋ก ์งํ (์ branch ์์ฑ ์คํต)
### Step 3: ์์
์ค๋ช
์์ฒญ
๋จผ์ ๋น์ ๋ก ์์ฌ์ํจ๋ค:
```
๊ฒํ ์์ฒญ(PR)์ ๋ง๋ค์ด๋ณผ๊ฒ์.
Google Docs์์ "์์ ์ ์" ๋ชจ๋ ์์์ฃ ?
์๋ณธ์ ๊ทธ๋๋ก ๋๊ณ , "์ด๋ ๊ฒ ๋ฐ๊พธ๋ฉด ์ด๋จ๊น์?" ํ๊ณ ๋ณด๋ด๋ ๊ฑฐ์์.
```
๊ทธ๋ค์ ์ฑํ
๋ฒํธํ ์ ํ์ง๋ก ๋ฌป๋๋ค (`shared/questioning-policy.md` ยงA) โ diff๋ ์ต๊ทผ commit์์ ์ค๋ช
์ **์ถ๋ก ํ ์ ์์ผ๋ฉด ๋ฌป์ง ์๊ณ ** ์ถ๋ก ์์ ์ ์ํ๊ณ ํ์ธ๋ง ๋ฐ๋๋ค:
```text
์ง๋ฌธ: ์ด๋ค ์์
์ ํ๋์ง ํ ์ค๋ก ์ ์ด์ฃผ์ธ์.
1. ์ง์ ์
๋ ฅ โ ํ ์ค๋ก ์๋ ค์ฃผ์ธ์ (์: "๋ฉ์ธ ํ์ด์ง ๋์์ธ ๋ณ๊ฒฝ", "์คํ ์์ ")
2. ์๋ ์์ฑ โ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ถ์ํด์ ์ค๋ช
์ ์๋์ผ๋ก ๋ง๋ค์ด์
3. ๋ฌธ์ฅ์ผ๋ก ์ง์ ์์ ์์ฒญ
```
### Step 4: Branch ์์ฑ (์ฌ์ฉ์์๊ฒ ์จ๊น)
ํ์ฌ branch๊ฐ main ๋๋ master์ธ ๊ฒฝ์ฐ์๋ง ์ branch๋ฅผ ์์ฑํ๋ค:
```bash
git checkout -b {slug}/{date}
```
Branch ์ด๋ฆ ๊ท์น:
- ์ฌ์ฉ์ ์
๋ ฅ์ slugํ: "๋ฉ์ธ ํ์ด์ง ๋์์ธ ๋ณ๊ฒฝ" โ `main-page-design`
- ๋ ์ง ์ถ๊ฐ: `main-page-design/0222`
- ํ๊ตญ์ด๋ ์์ด๋ก ๊ฐ๋จํ ๋ณํํ๊ฑฐ๋ ๋ก๋ง์ํ
์ฌ์ฉ์์๊ฒ๋: "์์ ํ ์์
๊ณต๊ฐ์ ๋ง๋ค์์ด์. ์ฌ๊ธฐ์๋ ๋ง์๊ป ์์ ํด๋ ์๋ณธ์ ์ํฅ์ด ์์ด์."
**์ด๋ฏธ ์ ์ฅ๋(commit) ๋ด์ฉ์ ์ branch๋ก ์ฎ๊ธฐ๋ ๊ฒฝ์ฐ**:
main์์ ์ด๋ฏธ commit๋ ์ํ๋ผ๋ฉด, branch๋ฅผ ๋ง๋ ๋ค main์ commit์ ๋๋๋ ค์ผ ํ๋ค.
๋ฏธ์ ์ก commit ์๋ Step 1์์ ์์งํ `git rev-list --count` ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๋ค:
```bash
git checkout -b {slug}/{date} # ์ branch ์์ฑ (commit ํฌํจ)
git checkout main # main์ผ๋ก ์ ์ ๋์๊ฐ
git reset --soft HEAD~{๋ฏธ์ ์ก commit ์} # main์ commit ๋๋๋ฆผ (staging area์ ๋จ์)
git checkout {slug}/{date} # ๋ค์ ์์
branch๋ก
```
> ์ฃผ์: ์ด ๊ณผ์ ์์ ๊ธฐ์กด ๊ฐ๋ณ commit ๋ฉ์์ง๋ค์ ํ๋๋ก ํฉ์ณ์ง๋ค (squash ํจ๊ณผ).
> ๋น๊ฐ๋ฐ์์๊ฒ๋ ์คํ๋ ค ๊น๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์๋๋ ๋์์ด๋ค.
> (์ฌ๊ธฐ์ ์ฐ๋ `reset --soft`๋ ๋ณ๊ฒฝ ๋ด์ฉ์ staging์ ๋จ๊ธฐ๋ ์์ ํ ๋ฐฉ์์ด๋ค โ `reset --hard`๊ฐ ์๋๋ค.)
### Step 5: Commit + Push
์์ ๋ ํ์ผ์ด ์๋ ๊ฒฝ์ฐ์๋ง commitํ๋ค (์ด๋ฏธ ์ ์ฅ๋ ๊ฒฝ์ฐ ์คํต):
```bash
git add -A # ์์ ๋ ํ์ผ์ด ์์ ๋๋ง
git commit -m "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์์
์ค๋ช
" # ์์ ๋ ํ์ผ์ด ์์ ๋๋ง
git push origin HEAD
```
### Step 6: PR ์์ฑ
```bash
gh pr create --title "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์์
์ค๋ช
" --body "$(cat <<'EOF'
## ๋ณ๊ฒฝ ๋ด์ฉ
{์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์์
์ค๋ช
}
---
Created by ๋ฐ๋ฅด๋ค ๊น์ ์
EOF
)"
```
### Step 7: main์ผ๋ก ๋ณต๊ท
PR ์์ฑ ํ, ์์ ํ๊ณ ์๋ main/master๊ฐ ์์๋ ๊ฒฝ์ฐ์๋ง main branch๋ก ๋์๊ฐ๋ค:
```bash
git checkout main
```
### Step 8: ์์์ฆ ์ถ๋ ฅ
```
๊ฒํ ์์ฒญ ์๋ฃ!
๋งํฌ: https://github.com/username/my-project/pull/1
์ด ๋งํฌ๋ฅผ ํ์์๊ฒ ๋ณด๋ด๋ฉด, ๋ณ๊ฒฝ ๋ด์ฉ์ ํ์ธํ๊ณ
"์ข์์, ๋ฐ์ํด์ฃผ์ธ์" ํ๊ณ ์น์ธํ ์ ์์ด์.
์ง๊ธ์ ์๋ ์์น(main)๋ก ๋์์จ ์ํ์์.
์๋ก์ด ์์
์ ์์ํ๋ ค๋ฉด ํ์ผ์ ์์ ํ ๋ค "์ ์ฅํด์ค"๋ผ๊ณ ํ์ธ์.
```
## ์ด๋ฏธ ๋ณ๋ branch์ ์๋ ๊ฒฝ์ฐ
Step 2์์ ํ์ฌ branch๊ฐ main/master๊ฐ ์๋ ๊ฒฝ์ฐ:
- Step 4(branch ์์ฑ)๋ฅผ ์คํต
- ํ์ฌ branch์์ ๋ฐ๋ก commit โ push โ PR ์์ฑ ์งํ
- "์ด๋ฏธ ์์
๊ณต๊ฐ์ ์์ด์, ๋ฐ๋ก ๊ฒํ ์์ฒญ์ ๋ง๋ค๊ฒ์."
## ์ถฉ๋ ํด๊ฒฐ
Merge Conflict ๊ฐ์ง ์ ์ถฉ๋ ํ์ผ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ณ , ์ฑํ
๋ฒํธํ ์ ํ์ง๋ก ๋ฌป๋๋ค (`shared/questioning-policy.md` ยงA):
```text
๋ ์ฌ๋์ด ๊ฐ์ ํ์ผ์ ๊ฐ์ ๋ถ๋ถ์ ๋์์ ๊ณ ์ณ์ ์ถฉ๋์ด ์๊ฒผ์ด์.
์ถฉ๋ ํ์ผ: {ํ์ผ ๋ชฉ๋ก}
์ง๋ฌธ: ์ด๋ป๊ฒ ํ ๊น์?
1. ๋ด๊ฐ ์์ ํ ๊ฑธ๋ก ์ ์ง โ ๋ด ๋ณ๊ฒฝ ๋ด์ฉ์ ์ฌ์ฉํด์
2. ์๋๋ฐฉ์ด ์์ ํ ๊ฑธ๋ก ์ ์ง โ ์๋๋ฐฉ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ฌ์ฉํด์
3. ๋ฌธ์ฅ์ผ๋ก ์ง์ ์์ ์์ฒญ
```
์ ํ์ ๋ฐ๋ผ:
- "๋ด ๊ฑฐ ์ ์ง": `git checkout --ours {ํ์ผ}` โ `git add {ํ์ผ}`
- "์๋๋ฐฉ ๊ฑฐ ์ ์ง": `git checkout --theirs {ํ์ผ}` โ `git add {ํ์ผ}`
์ถฉ๋ ํ์ผ์ด ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ํ์ผ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ณ ์ผ๊ด ์ฒ๋ฆฌํ๋ค.
## ์ค๋ฅ ์ฒ๋ฆฌ
- **PR ์ด๋ฏธ ์กด์ฌ**: "์ด ์์
๊ณต๊ฐ์ ๊ฒํ ์์ฒญ์ด ์ด๋ฏธ ์์ด์." โ ๊ธฐ์กด PR URL ์๋ด (์๋ก ๋ง๋ค์ง ์๋๋ค)
- **push ์คํจ**: upload ์คํฌ์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋์ผํ๊ฒ ์๋ด
- **gh pr create ์คํจ**: "๊ฒํ ์์ฒญ ์์ฑ์ ์คํจํ์ด์." โ `gh auth status` ์ฌํ์ธ ์๋ด
## Safety
- `git reset --hard`๋ ์ฌ์ฉํ์ง ์๋๋ค (branch ์ด๋ ์์๋ `reset --soft`๋ง ์ฌ์ฉ).
- ์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก ์์ฒญํ์ง ์์ผ๋ฉด commit๋ ํ์คํ ๋ฆฌ๋ฅผ ์ฌ์์ฑํ์ง ์๋๋ค.
- ๊ฐ์ branch์ ์ด๋ฏธ PR์ด ์์ผ๋ฉด ์๋ก ๋ง๋ค์ง ์๊ณ ๊ธฐ์กด PR URL์ ๋ณด์ฌ์ค๋ค.
View on GitHub