01-git Git 규칙
에이전트 금지 명령 (CRITICAL)
에이전트 금지 명령 (CRITICAL)
❌ 절대 금지: rebase, merge (ff-only 제외), checkout --ours/--theirs, conflict 자동 해결, push -f/--force
✅ 허용: status/log/diff/fetch, 새 브랜치 생성(checkout -b), add/commit/push origin {branch}
- push는 반드시 현재 브랜치 → 동일 이름 remote (
push origin feature/xxx) —push origin feature/xxx:master같은 cross-push 절대 금지
Conflict 발생 시: 즉시 --abort 후 사용자 보고 — 자동 해결 절대 금지
ff-only merge 실패 시: rebase/merge --no-ff 자동 시도 금지 → 즉시 멈추고 사용자에게 보고:
"ff-only merge가 불가합니다 (브랜치가 분기됨).
01-git 규칙상 rebase는 금지되어 있습니다.
1. PR 방식으로 전환 (→ origin/master)
2. 사용자가 직접 처리"
❌ 절대 금지: rebase, checkout --ours/--theirs, conflict 자동 해결, push -f/--force
✅ 허용: merge --no-ff (충돌 없을 때), merge --ff-only, status/log/diff/fetch, 새 브랜치 생성(checkout -b), add/commit/push origin {branch}
- push는 반드시 현재 브랜치 → 동일 이름 remote (
push origin feature/xxx) —push origin feature/xxx:master같은 cross-push 절대 금지
Conflict 발생 시: 즉시 merge --abort 후 사용자 보고 — 자동 해결 절대 금지. 충돌 없는 merge만 자동 완료.
ff-only merge 실패 시: merge --no-ff로 재시도 허용. 충돌 발생하면 즉시 merge --abort 후 사용자 보고. rebase는 여전히 금지.
작업 시작 전 환경 점검
코드 변경 작업(feat/fix/refactor) 시작 전 아래를 순서대로 확인한다. 조회/분석/테스트만 실행하는 경우 생략 가능. 문서만 변경하는 경우 1~2만 확인. continuation 세션(컨텍스트 리셋 후 이어받은 세션)도 예외 없이 실행한다.
- Remote 현행화:
git fetch origin— 최신 참조 정보를 가져온다 (메타데이터만, 코드 변경 없음) - Uncommitted 변경 확인:
git status— 현재 작업 디렉토리에 커밋되지 않은 변경이 있는지 확인한다- clean → 정상 진행
- dirty → 사용자에게 보고 후 지시 대기 (에이전트가 임의로 stash/reset/checkout 금지)
- staged/unstaged 혼재 → 추가 경고 (hook이 stash/pop 과정에서 staged 버전을 소실할 수 있음)
- 기준 브랜치 대비 behind 확인: 아래 "브랜치 작업 시작 전 체크"와 동일 기준 적용
- 브랜치 선택 판단: 아래 "기존 브랜치 vs 신규 브랜치 판단"에 따라 결정
04-lifecycle Step 5에서 이미 git status를 확인한 경우 2번은 재실행하지 않는다.
기존 브랜치 vs 신규 브랜치 판단
작업 시작 시 현재 브랜치에서 이어 작업할지, 새 브랜치를 만들지 판단한다.
# 판단에 필요한 정보 수집
git branch --show-current # 현재 브랜치
git log --oneline -3 # 최근 커밋 (작업 맥락 파악)
git branch -r --sort=-committerdate | head -5 # 최근 활성 remote 브랜치
기존 브랜치 이어 작업 (아래 조건 모두 충족 시)
- 현재 브랜치가 요청된 작업과 동일 주제
- 브랜치가 노후 기준(3일 / behind 50+) 미초과
- 다른 에이전트/세션이 작업 중이 아님 (아래 확인)
신규 브랜치 생성 (아래 중 하나라도 해당 시)
- 요청된 작업이 현재 브랜치 주제와 다름
- 현재 브랜치가 노후 기준 초과
- 현재가 main/master/develop (보호 브랜치)
다른 세션 작업 중 확인
# ~/.claude/sessions/{project}.md HANDOFF에 status: partial + 동일 브랜치면 충돌 가능
# ACTIVE_WORK.md에 해당 프로젝트의 진행 중 작업이 있으면 확인 필요
| 상황 | 판단 |
|---|---|
세션 파일에 status: partial + 같은 브랜치 |
⚠️ 사용자에게 "이전 세션이 미완료 상태입니다. 이어 작업할까요?" 확인 |
| ACTIVE_WORK.md에 다른 프로젝트 작업 진행 중 | 정상 진행 (프로젝트 다름) |
| remote에 같은 브랜치의 최근 push가 있고 로컬에 없는 커밋 | ⚠️ "다른 세션에서 push된 커밋이 있습니다" 경고 + git pull --ff-only 제안 |
| 판단 불가 | 사용자에게 질문 — 임의 판단 금지 |
브랜치 규칙
- 브랜치명:
feature/{YYMMDD}-{description}(예:feature/260120-auth-refactor) - 에이전트는 항상 feature 브랜치에서 작업 — develop/main 직접 커밋 금지
- 새 브랜치는 기준 브랜치의 remote 최신 시점에서 분기한다 — 로컬에 캐시된 오래된 기준 브랜치에서 분기 금지
- 기준 브랜치 = PR 타겟 브랜치 — 분기 base 와 PR 타겟이 달라지면 두 브랜치 간 divergence 로 고아 커밋이 딸려 들어가거나 역방향 싱크가 발생한다. 아래 원칙을 따른다:
develop이 있는 프로젝트:origin/develop에서 분기 → PR 타겟developdevelop이 없는 프로젝트:origin/main(또는master) 에서 분기 → 먼저develop을 생성 → 이후origin/develop에서 분기 (04-lifecycle 에 "develop 브랜치가 없는 프로젝트는 자동 생성한다" 명시)main과master는 동일하게 취급- 에이전트 모드가
production(→ main) 인 경우에만 예외적으로origin/main에서 분기 → PR 타겟main
- feature → develop PR → 사용자 승인 후 병합
- 브랜치 노후 기준: 3일 이상 또는 develop 대비 behind 50+ commits → 경고 + v2 브랜치 전환 제안
브랜치 작업 시작 전 체크
모든 feature 브랜치 시작 전:
git rev-list --count HEAD..origin/develop # behind 커밋 수 확인
git log --oneline -1 # 브랜치 나이 확인
3일 이상 또는 behind 50+: 사용자에게 경고 → 아래 선택지 제시:
"1. 사용자가 직접 rebase 후 재작업 (에이전트 실행 금지)
2. v2 브랜치 새로 생성 (→ feature/{YYMMDD}-{desc}-v2)
3. 위험 감수하고 현재 브랜치 그대로 진행"
커밋 규칙
- 형식:
{type}({scope}): {설명}(conventional commits) — commitlint이 commit-msg hook에서 검증 (tooling.commitlint)- type:
feat,fix,docs,chore,refactor,test,style
- type:
- Co-Authored-By 필수:
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
커밋 & 푸시 프로세스
기본값: 에이전트 모드에 따름 (04-lifecycle 참조, 기본 auto)
- 브랜치 보호 체크 (CRITICAL — 커밋 전 필수) — guard-branch.sh hook이 이중 차단 (
governance):git branch --show-current로 현재 브랜치 확인- main/master/develop 브랜치이면 커밋 실행 금지 → 사용자에게 알림
- 사용자가 예외를 선택해야만 진행 가능
- 소스 검증 — lint-staged가 pre-commit hook에서 자동 실행 (
tooling.lint_staged)- 검증 실패 시 커밋 자동 중단
- 검증 우회(
// @ts-ignore,eslint-disable) 금지
- Diff 보고: 변경 파일 + 줄 수, 1000줄+ 경고
- 모드별 동작:
manual: 커밋만 (푸시 차단, PR 차단)auto: 사용자 승인 후 커밋+푸시 — "커밋+푸시 (→ origin/{branch})" / "커밋만 (로컬)" / "취소"auto-push: 자동 커밋+푸시 (feature 브랜치에서만)- 기타 모드: 프로젝트 extension 정의 따름
- 모드별 동작:
manual: 커밋만 (푸시 차단, PR 차단)auto/auto-push: 자동 커밋+푸시 (feature 브랜치에서만, 승인 불필요)- 기타 모드: 프로젝트 extension 정의 따름
변명 방지 테이블
| 에이전트 변명 | 현실 | 올바른 행동 |
|---|---|---|
| "feature 브랜치 만들 시간이 없어서 develop에 직접 커밋" | 보호 브랜치 규칙은 긴급성과 무관 | checkout -b feature/... 후 커밋 |
| "rebase하면 깔끔해지니까 자동으로 해도 될 것" | 에이전트 rebase는 절대 금지 | 즉시 --abort + 사용자 보고 |
| "push --force로 빨리 정리하면 되니까" | force push는 R2 비가역 작업 | 사용자 확인 문구 재입력 필수 |
| "이전 세션에서 push 승인받았으니 이번에도 가능" | 세션 간 승인은 이전되지 않음 | 현재 세션에서 재확인 |
Push/PR 전 충돌 사전 확인
push 또는 PR 생성 직전, 아래를 확인한다. 이 단계는 소스 검증(tsc, lint 등)과 별개다.
- Remote 재현행화: 작업 중 기준 브랜치가 진행되었을 수 있으므로 remote 상태를 다시 가져온다
- 기준 브랜치와 변경 파일 겹침 확인: 현재 브랜치 변경 파일과 기준 브랜치 변경 파일을 비교한다
- 겹치는 파일 없음 → 정상 진행
- 겹치는 파일 있음 → 충돌 가능성을 사용자에게 보고
- 충돌 감지 시: 에이전트가 merge/rebase로 해결 시도 금지 (기존 규칙). 사용자에게 선택지 제시:
- 사용자가 직접 rebase/merge
- 그대로 PR 생성 (GitHub/GitLab에서 충돌 해결)
- v2 브랜치로 재작업
sync tool 예외 (화이트리스트 기반)
일반 원칙: 에이전트는 develop/main 직접 커밋·병합 금지.
예외: .claude/sync-tool-allowlist 에 등록된 결정론적 배포 스크립트는 아래 조건을
모두 만족할 때 develop 에 직접 병합할 수 있다.
- worktree 에서 격리 실행 (본체 working tree 미변경)
- ff-only 병합만 (충돌 시 PR 폴백)
- 커밋 메시지 형식:
chore(sync): apply {tool}@{sha} - push 실패 시 로컬 develop 자동 롤백 (병합 전 SHA 로 reset)
현재 등록된 예외 (ai-rules 기준):
scripts/sync.mjs— 규칙 문서를 각 프로젝트로 배포 (ai-rules self-sync 한정)
예외 추가 절차: PR 로 .claude/sync-tool-allowlist 수정 + docs/changes/ 에 결정 문서.
LLM 추론이 개입하는 스크립트는 예외 대상이 아니다.
배포 / 보호 브랜치 병합
자동 금지 (에이전트 자체 판단)
에이전트가 스스로 판단하여 운영 배포, main/master 병합, 프로덕션 환경 변경, 보호 브랜치 직접 커밋을 실행하지 않는다.
사용자 명시 요청 시 — 지시 자체가 휴먼 승인
"운영 배포해줘" / "main에 병합해줘" / "stg 배포해줘" / "dev>stg>main pr 생성 병합" 같은 명시 지시는 그 자체가 휴먼 승인이다. 재확인 문구·추가 버튼 불필요. 지시에 포함된 플로우를 끝까지 실행하고 결과만 보고한다.
단, 아래는 명시 요청에도 확인 문구 1회 유지 (치명 R2):
- force-push (
push -f,push --force) - cross-push (
push origin branchA:branchB) .env/ 시크릿 파일 수정
보호 브랜치 직접 커밋 vs PR 병합
| 행위 | 에이전트 가능? |
|---|---|
보호 브랜치 체크아웃 후 git commit |
❌ 금지 (명시 요청에도) — feature 브랜치 우회 |
보호 브랜치로 git push origin main 직접 |
❌ 금지 (명시 요청에도) |
| PR 생성 + PR merge (gh pr merge) | ✅ 명시 요청 시 가능 |
| 병합 후 자동 배포 트리거 | ✅ 명시 요청 시 가능 |
"보호 브랜치 push 금지"는 feature 브랜치를 거치지 않는 직접 커밋을 막기 위한 것이지, PR을 통한 정상 병합까지 막는 것이 아니다.
휴먼 승인의 범위 (세션 내)
명시 지시의 휴먼 승인은 그 지시 시점까지 완료된 업무에 한해 유효하다.
- [1] 사용자: "기능 A 작업" → feature/A → develop 병합 (auto 기본)
- [2] 사용자: "main 배포" → 현재 develop HEAD → main 배포 (이 시점까지 완료된 것까지)
- [3] 사용자: "기능 B 작업" → feature/B → develop까지만 (auto 기본 복귀)
- [4] 사용자: "B도 main까지" → 새 명시 지시 → main 배포
[2]의 승인이 [3] 이후 작업에 자동 적용되지 않는다. 이전 세션의 승인이 전이되지 않는 것과 동일하게, 같은 세션 내에서도 새 작업은 새 승인이 필요하다.
프로젝트 브랜치 구조 감지
"main 배포" / "운영 배포" 지시를 받으면 git branch -r 로 실제 브랜치 구조를 확인해 플로우를 결정한다. "stg 없는데 어떻게 할까요?" 같은 재질문은 하지 않는다.
| 존재하는 브랜치 | 실행 플로우 |
|---|---|
| develop + stg + main | develop → stg → main (2단계 PR+병합) |
| develop + main (stg 없음) | develop → main (1단계 PR+병합) |
| main 만 (develop 없음) | 현재 feature → main (단일 PR+병합) |
실제 존재하는 중간 단계만 거쳐 main(master)까지 도달한다.
CI 규칙
- 테스트 약화 금지: 테스트를 통과시키기 위해 테스트를 수정하거나 우회하지 않음
- 체크 우회 금지:
eslint-disable,@ts-ignore등으로 CI 체크 우회 금지 - 오픈 PR 충돌: 다른 오픈 PR과 파일 충돌 시 → 커밋 없이 코멘트만
- 에이전트 PR 추가 검증: 에이전트가 생성한 PR은 사람이 작성한 PR보다 reviewer subagent 통과를 필수로 적용 (GitHub Copilot Agent / Devin 표준 패턴)
- reviewer subagent 미통과 시 PR 생성 금지
- PR 본문에
🤖 Generated by agent표기 필수