현장에서 있었던 일
승인 뒤에 올라온 커밋
상황
리뷰어가 PR을 승인한 뒤, 작성자가 작은 수정 커밋을 하나 더 올렸어요.
위험
병합 버튼은 최신 커밋을 합쳐요. 검토하지 않은 코드가 그대로 들어갈 뻔했어요.
바꾼 것
병합할 때 승인한 커밋을 지정하고, 다르면 거절되게 했어요. 바뀌었으면 그 부분만 다시 리뷰해요.
4주차 · 안전한 변경: git·워크트리·PR — 18
커머스 AI 운영 실전 8주 과정 · 4주차
검토한 코드와 합친 코드가 정말 같은가
난이도 LV.4 중급
수업 3시간 · 자료 4시간 40분
실습: contto.ai 70% 클론
4 / 8
이번 주 목표
01
형식 두 개를 서로 다른 워크트리에서 동시에 만들어요.
02
PR마다 lint·typecheck·test가 돌고, 정확한 커밋을 검토해요.
03
매체 → 형식 → 고객 유형 → 내용 → 만들기와 이미지(1장)·스레드 글을 붙여요.
4주차 · 안전한 변경: git·워크트리·PR — 2
진행 순서
진한 칸(코어)만 하면 3시간 수업이에요. 회색 칸은 확장·자습이에요.
0:00
복습 리뷰
0:20
개념 핵심
1:05
개념 심화
1:20
영상 노트
1:40
강사 시연
2:10
실습 1
3:20
실습 2 도전
4:05
상급 노하우
4:25
회고 과제
4주차 · 안전한 변경: git·워크트리·PR — 3
진행 순서 · 자세히
| 시간 | 순서 | 내용 | 구분 |
|---|---|---|---|
| 0:00–0:20 | 복습·과제 리뷰 | 세션 교체 경험 두 명 발표 | 코어 |
| 0:20–1:05 | 개념 (핵심) | 워크트리, 병합 규칙, 정확한 커밋, 마이그레이션 | 코어 |
| 1:05–1:20 | 개념 (심화) | 폴더가 곧 URL, 기능 하나 = 스킬 하나 | 확장 |
| 1:20–1:40 | 참고 영상 노트 | 양실장 코드 해부, CNV 3단계 스킬 동기화 | 확장 |
| 1:40–2:10 | 강사 시연 | 워크트리 두 개에서 형식 두 개 | 코어 |
| 2:10–3:20 | 실습 1 (기본) | 만들기 마법사·이미지·스레드·PR·CI·병합 | 코어 |
| 3:20–4:05 | 실습 2 (도전) | 자료실: 사진 업로드 | 확장 |
| 4:05–4:25 | 상급 노하우 | 병렬 워크트리와 헤드리스 실행 | 확장 |
| 4:25–4:40 | 회고·과제 | 병합 결과 예측 vs 실제 공유 | 코어 |
4주차 · 안전한 변경: git·워크트리·PR — 4
지난주 복습
스킬
형식마다 스킬 하나씩 (이미지·스레드)
이번 주고객 유형
만들기 마법사의 세 번째 단계에서 골라요
3주팩트시트
카피·이미지 문구는 팩트시트 밖 숫자를 쓰지 못해요
토대4주차 · 안전한 변경: git·워크트리·PR — 5
미니 콘토 지도
도전: 자료실에 사진을 올리고 이미지(1장)에서 내 사진을 골라요.
01
사람어디에 올릴지 골라요
02
사람이미지(1장)·스레드
03
사람누구에게 말할지
04
사람제품·할인·전할 말
05
AI후보가 나와요
4주차 · 안전한 변경: git·워크트리·PR — 6
개념 1
에이전트 둘이 한 폴더에서 일하면 서로의 파일을 덮어써요.
4주차 · 안전한 변경: git·워크트리·PR — 7
개념 1 · 움직임으로
1
main에서 출발해요
2
A: 이미지(1장) 브랜치
3
B: 스레드 글 브랜치
4
A는 PR·CI 통과 후 병합
5
B는 형식 목록에서 충돌
6
두 의도를 모두 살려 해결
4주차 · 안전한 변경: git·워크트리·PR — 8
개념 2
기계가 먼저 거르고, 사람은 판단에 집중해요.
01
사람main에 직접 커밋하지 않아요
02
AI30분 리뷰 크기, 기능·테스트·스킬 함께
03
코드lint·typecheck·test 초록
04
사람승인한 커밋을 적어요
사람 승인 관문
05
코드승인한 커밋으로만 합쳐요
4주차 · 안전한 변경: git·워크트리·PR — 9
개념 3
병합 전에 '합치면 무엇이 바뀌나'를 에이전트에게 예측시켜요.
작성자
AI리뷰어
사람GitHub
코드1. PR · 커밋 A
2. 커밋 A 승인
3. 작은 수정 커밋 B
4. A로만 병합 요청
5. 최신이 B라 거절
6. B만 다시 리뷰
7. B 승인 후 병합
4주차 · 안전한 변경: git·워크트리·PR — 10
개념 4
번호는 병합 직전에 정하고, 파일마다 되돌리는 법을 적어요.
다음 번호
둘 다 003을 만들면 병합 때 부딪혀요
병합 직전002_offers
002부터 변경. 파일 하나에 변경 하나, 되돌리는 법도 함께
변경001_brands
처음 만드는 테이블. 번호 순서대로 쌓여요
생성4주차 · 안전한 변경: git·워크트리·PR — 11
개념 5
CI에는 진짜 키가 없어요. 테스트는 가짜 응답으로 돌아요.
# .github/workflows/ci.yml
name: ci
on: [pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- run: pnpm install --frozen-lockfile
- run: pnpm lint && pnpm typecheck && pnpm test
4주차 · 안전한 변경: git·워크트리·PR — 12
개념 6 · 심화
PR은 '어느 URL이 바뀌나'로 읽으면 쉬워져요.
폴더 = URL
app/ 아래가 주소예요
app/create/page.tsx
→ /create 화면
app/api/produce/route.ts
→ /api/produce API
app/brand/[id]/page.tsx
→ /brand/아무 아이디
components/ · lib/
재사용 부품 · 로직
4주차 · 안전한 변경: git·워크트리·PR — 13
개념 7 · 심화
기능 만들기
스킬도 함께 만들기
기능 바꾸기
PR에 스킬 변경
회귀 점검
연관 스킬 확인
PR 설명
확인 결과 적기
기능 하나 = 스킬 하나
PR 템플릿의 체크 칸으로
4주차 · 안전한 변경: git·워크트리·PR — 14
운영 루프에서
콘텐츠의 승인 관문과 코드의 PR 리뷰는 같은 원리예요.
01
코드고객 유형·팩트시트를 읽어요
02
AI이번 주: 형식별 생성기
03
사람PR 리뷰 = 코드의 승인 관문
사람 승인 관문
04
코드병합은 승인한 커밋만
05
코드PR 기록이 변경의 원장
기록이 다음 작업의 입력이 돼요
4주차 · 안전한 변경: git·워크트리·PR — 15
참고 영상 노트
출처: 양실장의 바이브코딩대학 「3시간 순삭) 55개 기술 의사결정, 소스코드 해설까지」 · https://www.youtube.com/watch?v=K6Rsy-pHBi0&t=8086s
134:46
화면·API, 부품, 로직, DB 변경이 폴더로 나뉘어요.
137:52
page는 화면, route는 API, 대괄호는 바뀌는 주소예요.
141:32
생성 다음 변경을 번호로 쌓고 되돌리는 법을 둬요.
112:08
사람이 마지막에 승인하는 운영 절차예요.
구조를 알아야 PR을 읽을 수 있어요.
4주차 · 안전한 변경: git·워크트리·PR — 16
참고 영상 노트
출처: CNV AI 「AI 에이전트 만들기 3단계 — AI에게 실제 업무 시스템을 개발시키는 방법」 · https://www.youtube.com/watch?v=hG9i8nFHEEs&t=1921s
32:01
기능을 만들 때 에이전트용 사용법 스킬도 같이.
36:16
하나를 고치면 관련 스킬이 아직 맞는지 확인해요.
37:51
'기능 변경 시 스킬 동기화'를 메인 지침에 넣어요.
59:29
문제가 생기면 그 모듈만 고쳐요.
PR 하나에 기능 + 테스트 + 스킬 변경이 함께 들어가요.
4주차 · 안전한 변경: git·워크트리·PR — 17
현장에서 있었던 일
상황
리뷰어가 PR을 승인한 뒤, 작성자가 작은 수정 커밋을 하나 더 올렸어요.
위험
병합 버튼은 최신 커밋을 합쳐요. 검토하지 않은 코드가 그대로 들어갈 뻔했어요.
바꾼 것
병합할 때 승인한 커밋을 지정하고, 다르면 거절되게 했어요. 바뀌었으면 그 부분만 다시 리뷰해요.
4주차 · 안전한 변경: git·워크트리·PR — 18
강사 시연 30분
볼 것: 같은 레지스트리 파일의 충돌 · 두 형식 모두 동작 · 승인한 커밋으로 병합
01
사람이미지·스레드 폴더 두 개
02
AI폴더마다 실행, 포트 3001·3002
03
코드둘 다 레지스트리에 등록, CI 초록
04
사람첫 PR 병합 → 둘 다 살리기
사람 승인 관문
05
사람병합 결과 예측 vs 실제 diff
4주차 · 안전한 변경: git·워크트리·PR — 19
시연 프롬프트
git worktree add ../mini-image -b feat/format-image
git worktree add ../mini-threads -b feat/format-threads
# mini-image 폴더의 에이전트에게
[목표] 형식 '이미지(1장)': 문구+사진 카드 후보 5안
[범위] lib/formats/image.ts, 레지스트리, skills/format-image/
[완료 조건] 후보 5안 미리보기, 팩트시트 밖 숫자 0, 테스트 통과
[하지 말 것] 다른 형식 파일 수정, 실제 이미지 API 키 사용
끝나면 gh pr create 까지 해.
4주차 · 안전한 변경: git·워크트리·PR — 20
실습 1 · 70분
4주차 · 안전한 변경: git·워크트리·PR — 21
실습 힌트
| 상황 | 이렇게 말해요 |
|---|---|
| 워크트리가 안 만들어져요 | "이미 체크아웃된 브랜치인지 확인하고 새 브랜치로 만들어" |
| 충돌이 났어요 | "두 PR의 의도를 각각 설명하고 둘 다 살리는 해결안을 보여 줘" |
| CI만 실패해요 | "CI 로그 전문이야. 로컬과 다른 점을 찾아 줘" |
| PR이 너무 커요 | "이 PR을 30분 안에 리뷰할 크기로 쪼개는 계획을 줘" |
| 병합 결과가 걱정돼요 | "합치면 바뀌는 파일과 이유를 먼저 예측해 줘" |
4주차 · 안전한 변경: git·워크트리·PR — 22
실습 2 · 도전 45분
완료: 10MB 초과·이미지 아닌 파일 거절 · 버킷 비공개 · 고른 사진으로 후보 생성
01
코드Storage 버킷 (비공개)
02
코드서버에서만, 크기·형식 검사
03
AI브랜드 > 자료실 화면에 사진 목록
04
사람이미지(1장) 만들기에서 내 사진
05
사람리뷰 + 승인한 커밋으로 병합
4주차 · 안전한 변경: git·워크트리·PR — 23
템플릿
## 무엇을 바꿨나 (한 문장)
## 바뀌는 화면·URL
## 확인 방법과 결과
- [ ] pnpm lint · typecheck · test 통과 (CI 초록)
- [ ] 화면 캡처 (데스크톱·모바일)
## 함께 바꾼 것
- [ ] 관련 스킬 (skills/…) 갱신 또는 해당 없음
- [ ] 마이그레이션 번호 확인
## 확인 못 한 것
## 승인한 커밋 (리뷰어가 적기): ________
4주차 · 안전한 변경: git·워크트리·PR — 24
안전 체크
정리
워크트리는 병합한 뒤에 지워요
마지막파일·데이터
마이그레이션 번호 겹침 확인, 업로드 크기·형식 제한, 버킷은 비공개
병합
PR마다 CI 초록, 승인한 커밋으로만 병합
브랜치
main에 직접 커밋하지 않기, force push 금지
토대4주차 · 안전한 변경: git·워크트리·PR — 25
흔한 실수
| 실수 | 무슨 일이 생기나 | 대신 이렇게 |
|---|---|---|
| 한 폴더에 에이전트 둘 | 서로의 파일을 덮어써요 | 워크트리 나누기 |
| 충돌을 한쪽 지우기로 해결 | 한 기능이 사라져요 | 두 의도 모두 살리기 |
| 승인 뒤 커밋을 그대로 병합 | 검토 안 된 코드가 들어가요 | 승인한 커밋 지정 |
| PR 하나에 기능 여러 개 | 리뷰가 대충 돼요 | 30분 리뷰 크기로 |
| 스킬은 그대로 둠 | 에이전트가 옛 방식으로 써요 | PR에 스킬 변경 포함 |
4주차 · 안전한 변경: git·워크트리·PR — 26
문제 해결
| 증상 | 원인 | 해결 |
|---|---|---|
| already checked out | 브랜치가 다른 워크트리에 있음 | 새 브랜치 이름으로 만들기 |
| lockfile 충돌 | 둘 다 패키지를 추가 | lockfile은 다시 설치로 재생성 |
| CI에서만 실패 | 환경변수·Node 버전 차이 | CI 로그 전문으로 원인 찾기 |
| 마이그레이션 번호 충돌 | 둘 다 같은 번호 | 병합 직전에 번호 다시 매기기 |
| 포트가 겹쳐요 | 같은 포트로 서버 둘 | 워크트리마다 다른 포트 |
4주차 · 안전한 변경: git·워크트리·PR — 27
자습 목록 · 확장
| 자료 | 볼 구간 | 볼 것 |
|---|---|---|
| 양실장 3시간 강의 | 134:46–160:21 | 폴더 구조, 마이그레이션, 코드 읽기 |
| 양실장 3시간 강의 | 104:04, 112:08 | 모듈형 모놀리스, PR 승인 후 배포 |
| CNV AI 3단계 | 32:01–38:22, 59:29 | 기능별 스킬, 회귀 점검, 모듈화 |
| 공식 문서 | git worktree | 워크트리 만들기·지우기 |
| 공식 문서 | GitHub Actions 빠른 시작 | PR마다 도는 워크플로 |
4주차 · 안전한 변경: git·워크트리·PR — 28
상급 노하우
| 기법 | 어떻게 | 왜 |
|---|---|---|
| 한 작업, 한 워크트리 | git worktree add, 또는 클로드 코드의 워크트리 시작 옵션 | 에이전트끼리 파일을 밟지 않아요 |
| 헤드리스 실행 | claude -p … --output-format json --max-turns 10, codex exec --json | 스크립트와 CI가 결과를 읽어요 |
| 밤 작업 | 매일 밤 모든 브랜드의 팩트시트를 헤드리스로 점검 | 사람이 없는 시간에 준비해 둬요 |
| PR마다 자동 리뷰 | claude-code-action, codex-action, codex review --base main | 사람 리뷰 전의 첫 거름망이에요 |
| 허용 도구를 좁게 | --allowedTools 로 명령 지정, 코덱스는 --sandbox workspace-write | 사람이 없는 실행일수록 권한을 줄여요 |
4주차 · 안전한 변경: git·워크트리·PR — 29
상급 노하우 · 예시
심화 과제(선택): 밤마다 팩트시트를 점검하는 헤드리스 스크립트와, PR마다 리뷰 댓글을 다는 GitHub Actions를 붙여요 (키는 저장소 비밀값으로)
# scripts/nightly.sh 팩트시트 점검
claude -p "brand-analysis 스킬로 brands 의 팩트시트를 점검하고
확인 필요 항목만 JSON 으로 보고해" \
--output-format json --max-turns 10 --allowedTools Read
codex exec --json --sandbox workspace-write "같은 점검을 해"
# .github/workflows/review.yml (요지)
on: pull_request
- uses: anthropics/claude-code-action@v1
with: { prompt: "RULES.md 기준으로 이 PR을 리뷰해" }
4주차 · 안전한 변경: git·워크트리·PR — 30
과제와 다음 주
다음 수업 첫 20분에 '병합 결과 예측 vs 실제'를 두 명이 발표해요.
다음 주
콘텐츠 상태·카피 검수 8항목·E2E 테스트로 '됐어요'를 증거로 바꿔요.
4주차 · 안전한 변경: git·워크트리·PR — 31