|
| 1 | +## 들어가기 |
| 2 | + |
| 3 | +여러분은 하나의 작업을 시작하고 PR을 올리기까지 Git Flow를 어떻게 처리하고 있나요? |
| 4 | + |
| 5 | +작업 전 `develop`이나 `main`을 최신화하고, 새 `feature` 브랜치를 만들고, 작업 후 커밋 규칙에 맞춰 커밋을 나누고, 푸시 계정을 확인한 뒤 PR을 올리고 있나요? |
| 6 | + |
| 7 | + |
| 8 | + |
| 9 | +이 과정은 작게는 5분, 상황에 따라 더 걸릴 수 있습니다. 작업 트리가 더럽거나, 기준 브랜치가 밀려 있거나, 커밋을 다시 나눠야 하면 기능 구현보다 Git 정리에 먼저 에너지를 씁니다. 저는 이 시간을 **업무의 비효율**로 정의하고 `git-flow` Skill을 만들었습니다. |
| 10 | + |
| 11 | +처음에는 제가 반복하던 절차를 줄이려는 목적이었습니다. 그런데 팀원이 브랜치 생성, 커밋 분리, 푸시 계정 확인에서 반복해서 헷갈리는 지점을 보면서 생각이 바뀌었습니다. 이건 개인의 Git 숙련도 문제가 아니라, 팀 안에서 반복 절차가 공유되지 않아 생기는 문제였습니다. |
| 12 | + |
| 13 | +제 경우에는 계정 확인도 Skill에 함께 넣었습니다. 일반적으로는 HTTPS 원격 주소와 브라우저 인증, 토큰 인증을 많이 쓰지만, 저는 개인 계정과 회사 계정을 SSH host alias로 분리해 사용하기 때문입니다. |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +## Git이 어려워서 생긴 문제가 아니었습니다 |
| 18 | + |
| 19 | +Git Flow 자체는 어려운 일이 아닙니다. 문제는 매번 같은 품질로 반복하기 어렵다는 점입니다. |
| 20 | + |
| 21 | +```text |
| 22 | +현재 브랜치 확인 |
| 23 | +작업 트리 확인 |
| 24 | +origin 확인 |
| 25 | +develop 최신화 |
| 26 | +새 feature 브랜치 생성 |
| 27 | +변경 파일 확인 |
| 28 | +커밋 단위 분리 |
| 29 | +커밋 메시지 규칙 확인 |
| 30 | +SSH 계정 확인 |
| 31 | +git push |
| 32 | +PR 생성 |
| 33 | +``` |
| 34 | + |
| 35 | +이 절차는 하나씩 보면 단순합니다. 하지만 실제 작업 중에는 쉽게 빠집니다. |
| 36 | + |
| 37 | +| 빠뜨리기 쉬운 일 | 생기는 문제 | |
| 38 | +| ------------------ | ------------------------------------------ | |
| 39 | +| 기준 브랜치 최신화 | 오래된 기준에서 브랜치 생성 | |
| 40 | +| dirty 상태 확인 | 사용자 변경과 새 작업 혼재 | |
| 41 | +| 커밋 단위 분리 | 기능 변경과 테스트 변경 혼재 | |
| 42 | +| 원격 주소 확인 | 푸시 대상 저장소 착각 | |
| 43 | +| SSH 계정 확인 | 기대한 계정이 아닌 계정으로 푸시 시도 | |
| 44 | +| 결과 보고 | 현재 브랜치와 푸시 상태를 다시 확인해야 함 | |
| 45 | + |
| 46 | +누군가는 기준 브랜치를 먼저 당기고, 누군가는 작업 브랜치부터 만들고, 누군가는 커밋을 파일 기준으로 나눕니다. 각자에게는 익숙한 방식이지만, 팀 단위에서는 작은 차이가 반복 스트레스가 됩니다. 특히 Git 상태가 꼬였을 때는 문제를 해결하기 전에 “어디서부터 달라졌는지”를 먼저 맞춰야 합니다. |
| 47 | + |
| 48 | +그래서 Git Flow를 Codex Skill로 분리했습니다. 좋은 Skill은 명령어 모음이라기보다, **팀이 같은 순서로 멈추고 확인하게 만드는 체크리스트**에 가깝습니다. |
| 49 | + |
| 50 | +--- |
| 51 | + |
| 52 | +## 기준을 Skill 안에 넣었습니다 |
| 53 | + |
| 54 | +제가 만든 `git-flow` Skill의 목적은 한 문장으로 정리할 수 있습니다. |
| 55 | + |
| 56 | +> 로컬 변경을 보존하면서 `develop` 기준으로 작업 브랜치를 만들고, 리뷰 가능한 커밋 단위로 정리한 뒤, 올바른 SSH 계정으로 안전하게 푸시합니다. |
| 57 | +
|
| 58 | +이를 위해 Skill은 여섯 단계로 동작합니다. |
| 59 | + |
| 60 | +1. 현재 상태 확인 |
| 61 | +2. `develop` 최신화 |
| 62 | +3. 새 브랜치 생성 |
| 63 | +4. 커밋 분리 |
| 64 | +5. 계정 확인 후 푸시 |
| 65 | +6. 결과 보고 |
| 66 | + |
| 67 | +핵심은 명령어보다 멈춤 조건입니다. 작업 트리가 더러우면 자동 `stash`나 `reset`을 하지 않습니다. `origin`이 기대한 원격 주소가 아니면 푸시 전 멈춥니다. `HEAD`와 `origin/develop`이 다르면 사용자 확인을 받습니다. 저장소에 별도 커밋 규칙이 있으면 Skill의 기본 규칙보다 저장소 규칙을 우선합니다. |
| 68 | + |
| 69 | +이 기준이 없으면 AI는 진행을 위해 너무 적극적으로 정리하려고 할 수 있습니다. Git 작업에서 빠른 실행보다 중요한 건 기존 변경을 보존하고, 잘못된 계정으로 푸시하지 않는 것입니다. |
| 70 | + |
| 71 | +--- |
| 72 | + |
| 73 | +## 긴 프롬프트 대신 `$git-flow`라고 말합니다 |
| 74 | + |
| 75 | +AI를 쓰더라도 처음에는 매번 같은 프롬프트를 반복했습니다. `develop` 기준으로 브랜치를 만들고, 작업을 커밋 규칙에 맞춰 나누고, 푸시 전 계정을 확인하고, 마지막에 PR을 올릴 수 있게 정리해달라는 식이었습니다. |
| 76 | + |
| 77 | +```text |
| 78 | +develop 최신화하고 새 feature 브랜치 만들어줘. |
| 79 | +작업 트리에 기존 변경이 있으면 건드리지 말고 먼저 알려줘. |
| 80 | +커밋은 기능 변경과 테스트 변경으로 나눠줘. |
| 81 | +커밋 메시지는 한글로 쓰고 타입을 붙여줘. |
| 82 | +origin이 git@business 형태인지 확인해줘. |
| 83 | +푸시 전에는 business SSH 계정인지 확인해줘. |
| 84 | +마지막에는 현재 브랜치와 커밋 목록, 원격 URL을 알려줘. |
| 85 | +``` |
| 86 | + |
| 87 | +Skill을 만든 뒤에는 이 긴 지시가 한 줄로 줄었습니다. |
| 88 | + |
| 89 | +```text |
| 90 | +$git-flow 진행해줘. |
| 91 | +``` |
| 92 | + |
| 93 | +프롬프트가 짧아진 것보다 더 중요한 변화는 기준이 고정됐다는 점입니다. 개인마다 다르게 기억하던 Git Flow가 하나의 Skill로 모이자, 팀원들은 같은 순서로 상태를 확인하고 같은 기준으로 멈출 수 있었습니다. |
| 94 | + |
| 95 | +| 항목 | 공유 전 | 공유 후 | |
| 96 | +| ----------- | ------------------------- | ----------------------------------- | |
| 97 | +| 시작 요청 | Git 절차를 매번 길게 설명 | `$git-flow 진행해줘` | |
| 98 | +| 기준 브랜치 | 개인 습관에 의존 | `develop` 기준 | |
| 99 | +| dirty 상태 | 상황마다 대응이 달라짐 | 자동 stash/reset 금지 | |
| 100 | +| 원격 주소 | 푸시 대상이 섞일 수 있음 | `git remote -v` 확인 | |
| 101 | +| 푸시 계정 | 푸시 직전 놓칠 수 있음 | `ssh -T business` 확인 | |
| 102 | +| 커밋 분리 | 파일 기준으로 섞이기 쉬움 | 변경 목적 기준 | |
| 103 | +| 마지막 보고 | 푸시 여부만 확인하는 경우 | 브랜치, 커밋, URL, 미커밋 파일 보고 | |
| 104 | + |
| 105 | +--- |
| 106 | + |
| 107 | +## 공유하고 나서 달라진 것 |
| 108 | + |
| 109 | +Skill의 효과는 자동화보다 표준화에 가까웠습니다. 버튼 하나로 모든 Git 작업이 끝나는 경험보다, 팀원이 같은 기준으로 멈추고 같은 형식으로 상태를 공유할 수 있게 된 변화가 더 컸습니다. |
| 110 | + |
| 111 | +예전에는 Git 상태가 꼬이면 먼저 상황 설명부터 길어졌습니다. “어떤 브랜치에서 시작했는지”, “`develop`을 언제 당겼는지”, “커밋을 왜 이렇게 나눴는지”, “어느 계정으로 푸시했는지”를 다시 확인해야 했습니다. Skill을 공유한 뒤에는 대화의 시작점이 달라졌습니다. `$git-flow`의 결과 보고를 보면 현재 브랜치, 커밋 목록, 원격 URL, 남아 있는 미커밋 파일을 같은 순서로 확인할 수 있었습니다. |
| 112 | + |
| 113 | +정성적인 변화는 세 가지였습니다. |
| 114 | + |
| 115 | +1. 브랜치 생성 전 상태 확인이 팀의 공통 루틴이 됐습니다. |
| 116 | +2. 커밋을 파일 기준이 아니라 변경 목적 기준으로 나누기 시작했습니다. |
| 117 | +3. 푸시 전 SSH 계정 확인이 빠지지 않는 절차가 됐습니다. |
| 118 | + |
| 119 | +덕분에 “Git이 꼬였는데 어떻게 되돌리지” 같은 대화가 줄었습니다. 더 정확히 말하면, Git 문제가 생겼을 때도 어디서부터 확인해야 하는지 팀이 같은 언어로 이야기할 수 있게 됐습니다. 저는 이 지점이 Skill을 만든 가장 큰 성과라고 봅니다. |
| 120 | + |
| 121 | +--- |
| 122 | + |
| 123 | +## 만들면서 남긴 기준 |
| 124 | + |
| 125 | +`git-flow` Skill을 만들면서 얻은 기준은 네 가지입니다. |
| 126 | + |
| 127 | +1. 실행 순서만 쓰지 말고 멈춤 조건을 씁니다. |
| 128 | +2. 사용자 변경을 보존하는 규칙을 먼저 둡니다. |
| 129 | +3. 환경마다 바뀌는 값은 수정 포인트로 분리합니다. |
| 130 | +4. 마지막 보고 형식을 정합니다. |
| 131 | + |
| 132 | +이 기준은 Git Flow에만 해당하지 않습니다. 반복되는 업무 절차를 AI에게 맡길 때는 항상 같은 문제가 생깁니다. 무엇을 할지보다 어디서 멈출지, 어떤 값이 팀마다 바뀌는지, 사용자가 마지막에 무엇을 확인해야 하는지가 더 중요합니다. |
| 133 | + |
| 134 | +팀에 공유할 Skill이라면 여기에 한 가지가 더 필요합니다. 개인 최적화가 아니라 팀원이 그대로 따라도 안전한 기준이어야 합니다. |
| 135 | + |
| 136 | +--- |
| 137 | + |
| 138 | +## 마무리 |
| 139 | + |
| 140 | +Git Flow는 개발자의 핵심 역량을 보여주는 작업은 아닙니다. 하지만 틀리면 꽤 귀찮은 작업입니다. 브랜치를 잘못 만들고, 커밋이 섞이고, 계정을 잘못 쓰고, 푸시 뒤에 다시 정리하는 시간은 작지만 반복해서 쌓입니다. 이 스트레스가 개인에게만 쌓이면 습관 문제가 되고, 팀 전체에 반복되면 협업 비용이 됩니다. |
| 141 | + |
| 142 | +저는 이 반복을 `git-flow` Skill로 분리했습니다. |
| 143 | + |
| 144 | +> 반복되는 Git 절차는 프롬프트가 아니라 Skill로 관리하는 편이 낫습니다. |
| 145 | +
|
| 146 | +AI Skill은 거창한 자동화가 아니어도 됩니다. 매번 5분씩 쓰던 절차를 안정적인 체크리스트로 바꾸고, 그 기준을 팀에 공유하는 것만으로도 충분히 가치가 있었습니다. 중요한 건 AI에게 더 많이 맡기는 게 아닙니다. 반복되는 절차를 문서화하고, 위험한 지점에서는 멈추게 하고, 팀원이 같은 기준으로 안전하게 작업하도록 만드는 것입니다. |
| 147 | + |
| 148 | +--- |
| 149 | + |
| 150 | +## 부록: Codex에 추가하기 |
| 151 | + |
| 152 | +아래 내용은 Codex 기준으로 바로 추가할 수 있는 형태입니다. 팀에 공유할 때는 `business`, `develop`, 브랜치 네이밍 규칙만 각 팀 환경에 맞게 바꾸면 됩니다. |
| 153 | + |
| 154 | +SSH host alias로 계정을 나눠 쓰는 경우에는 먼저 alias를 준비합니다. HTTPS를 쓴다면 이 단계는 팀의 인증 방식에 맞게 바꾸면 됩니다. |
| 155 | + |
| 156 | +```sshconfig |
| 157 | +Host business |
| 158 | + HostName github.com |
| 159 | + User git |
| 160 | + IdentityFile ~/.ssh/id_ed25519_business |
| 161 | + IdentitiesOnly yes |
| 162 | +``` |
| 163 | + |
| 164 | +회사 저장소의 remote가 SSH alias를 사용하도록 맞춥니다. |
| 165 | + |
| 166 | +```bash |
| 167 | +git remote set-url origin git@business:<org>/<repo>.git |
| 168 | +git remote -v |
| 169 | +ssh -T business |
| 170 | +``` |
| 171 | + |
| 172 | +이제 Codex Skill 파일을 추가합니다. |
| 173 | + |
| 174 | +```bash |
| 175 | +mkdir -p ~/.codex/skills/git-flow |
| 176 | +cat > ~/.codex/skills/git-flow/SKILL.md <<'EOF' |
| 177 | +--- |
| 178 | +name: git-flow |
| 179 | +description: "`develop` 기반 저장소에서 브랜치 작업을 시작하고 배포 가능한 형태로 푸시할 때 사용하는 표준 절차입니다. `develop` 최신화, 새 브랜치 생성, 리뷰하기 좋은 커밋 분리, `ssh -T business` 계정 확인, 원격 푸시가 필요할 때 사용합니다." |
| 180 | +--- |
| 181 | +
|
| 182 | +# Git Flow |
| 183 | +
|
| 184 | +## 개요 |
| 185 | +
|
| 186 | +이 스킬은 Git 작업을 시작할 때마다 같은 품질로 수행하기 위한 체크리스트입니다. 로컬 변경을 보존하면서 `develop` 기준으로 작업 브랜치를 만들고, 리뷰 가능한 커밋 단위로 정리해 `business` SSH 계정으로 안전하게 푸시합니다. |
| 187 | +
|
| 188 | +## 빠른 실행 순서 |
| 189 | +
|
| 190 | +1. 현재 상태 확인 |
| 191 | + - `git rev-parse --abbrev-ref HEAD` |
| 192 | + - `git status --short` |
| 193 | + - `git remote -v` |
| 194 | + - `origin`이 `git@business:...` 형태인지 확인 |
| 195 | +2. `develop` 최신화 |
| 196 | + - `git fetch origin --prune` |
| 197 | + - 필요하면 `git checkout develop` |
| 198 | + - 작업 트리가 깨끗하면 `git pull --ff-only origin develop` |
| 199 | + - 작업 트리가 더럽다면 자동 stash/reset 금지 |
| 200 | + - `HEAD`와 `origin/develop`를 비교해 동일하면 최신화 완료로 간주 |
| 201 | + - 동일하지 않으면 사용자 확인 후 진행 |
| 202 | +3. 새 브랜치 생성 |
| 203 | + - 예시: `feature/<주제>`, `bugfix/<주제>` |
| 204 | + - `git checkout -b <새브랜치>` |
| 205 | +4. 커밋 분리 |
| 206 | + - 파일 기준이 아니라 변경 목적 기준으로 분리 |
| 207 | + - 권장 단위 |
| 208 | + - 기능 변경(도메인/API/서비스) |
| 209 | + - 테스트/검증 보강 |
| 210 | + - 단계별로 `git add <경로>` 후 `git diff --cached` 검토 |
| 211 | + - 커밋 메시지는 기본적으로 한글 제목을 사용 |
| 212 | + - 형식: `type: <한글 제목>` |
| 213 | + - 예시: `feat: 레거시 워크플로우 동기화 API 추가` |
| 214 | + - `git commit -m "<메시지>"` |
| 215 | +5. 계정 확인 후 푸시 |
| 216 | + - `ssh -T business` |
| 217 | + - 출력 계정이 기대한 계정인지 확인 |
| 218 | + - `git push -u origin <새브랜치>` |
| 219 | +6. 결과 보고 |
| 220 | + - 현재 브랜치 |
| 221 | + - 커밋 목록 (`git log --oneline -n <개수>`) |
| 222 | + - 원격 안내 URL(출력되면) |
| 223 | + - 의도적으로 남긴 미커밋 파일 |
| 224 | +
|
| 225 | +## 수정 포인트 |
| 226 | +
|
| 227 | +필요 시 아래 항목만 바꿔서 재사용하면 됩니다. |
| 228 | +
|
| 229 | +- 기준 브랜치: `develop` |
| 230 | +- SSH 호스트 별칭: `business` |
| 231 | +- 브랜치 네이밍 규칙: `feature/*`, `bugfix/*` |
| 232 | +- 커밋 분리 규칙: 기능/테스트 2단 구조(또는 팀 규칙에 맞게 확장) |
| 233 | +
|
| 234 | +## 커밋 메시지 기준(한글) |
| 235 | +
|
| 236 | +- 기본 언어는 한글로 작성합니다. |
| 237 | +- 타입은 `build|ci|docs|feat|fix|perf|refactor|style|test`를 사용합니다. |
| 238 | +- 제목은 간결한 명령형으로 작성하고, 마침표는 붙이지 않습니다. |
| 239 | +- 저장소에 별도 규칙이 있으면 그 규칙을 우선합니다. |
| 240 | +
|
| 241 | +## 안전 수칙 |
| 242 | +
|
| 243 | +- 사용자 요청 없이 `git reset --hard`, `git checkout --` 같은 파괴적 명령을 실행하지 않습니다. |
| 244 | +- 로컬 전용 설정/시크릿 파일은 명시적 요청 없이는 커밋하지 않습니다. |
| 245 | +- 무관한 기존 변경사항을 새 기능 커밋에 섞지 않습니다. |
| 246 | +EOF |
| 247 | +``` |
| 248 | + |
| 249 | +설치 후 Codex에서 아래처럼 요청하면 됩니다. |
| 250 | + |
| 251 | +```text |
| 252 | +$git-flow 기준으로 feature 브랜치 만들고 푸시 준비해줘. |
| 253 | +``` |
| 254 | + |
| 255 | +또는 작업이 끝난 뒤 이렇게 요청할 수 있습니다. |
| 256 | + |
| 257 | +```text |
| 258 | +$git-flow 기준으로 커밋 나누고 business 계정 확인 후 푸시해줘. |
| 259 | +``` |
0 commit comments