Chapter 9 의 SDD 사이클로 한 번에 하나의 기능을 완성하는 흐름을 익혔습니다. 이번 레슨은 그 사이클을 둘 이상 동시에 돌릴 때 부딪히는 충돌을 다룹니다. 브랜치만으로는 막을 수 없는 이유를 짚고, git worktree로 각 Claude에게 독립된 작업 폴더를 주는 방법을 익힙니다. claude -w로 worktree 생성부터 정리까지 한 번에 처리합니다.
Claude A에게 README에 사용법 섹션을, Claude B에게 README에 라이선스 섹션을 추가해달라고 가정합니다. 같은 폴더에서 두 Claude를 동시에 실행하면 같은 파일을 동시에 수정하므로 한쪽이 저장한 내용을 다른 쪽이 덮어씁니다.
여기서 자연스러운 의문이 듭니다. "브랜치를 따로 만들면 되지 않나?" Claude A는 feature-usage에서, Claude B는 feature-license에서 일하면 변경이 섞이지 않을 것 같습니다.
실제로 해보면 한 가지 사실이 드러납니다. 한 폴더는 한 번에 한 브랜치의 파일만 담고 있습니다.
같은 경로의 파일이, 꺼낸 브랜치에 따라 통째로 다른 내용으로 교체됩니다
feature-usage 브랜치를 꺼내면 폴더 안 README.md에 "## 사용법"이 들어 있고, ch10-02로 전환하면 같은 경로의 파일이 통째로 원본으로 교체됩니다. 같은 슬롯이 시점마다 다른 내용을 담으므로, 같은 폴더를 쓰는 두 Claude는 같은 브랜치를 공유할 수밖에 없습니다.
여기에 미커밋 변경이 남아 있으면 git은 그 브랜치를 떠날 수조차 없게 막습니다. 결과적으로 각자 자기 브랜치에 격리된 채 동시에 일하는 건 불가능합니다.
이제 worktrees/feature-a/를 VS Code로 열고 파일을 수정해봅니다. 원본 폴더의 Source Control 패널(Cmd+Shift+G)과 worktrees/feature-b/에는 그 변경이 전혀 보이지 않습니다. 에러도 stash도 없이, 두 기능을 동시에 진행할 수 있습니다.
claude -w는 세 가지를 자동으로 처리합니다. .claude/worktrees/ 아래에 worktree를 만들고, 그 폴더에서 Claude 세션을 시작하고, 세션 종료 시 변경 유무에 따라 자동으로 정리하거나 Keep/Remove를 물어봅니다. -w는 --worktree의 축약형입니다.
이름을 지정해 실행합니다.
claude -w update-page-title# ─────────────────# worktree 이름
이름을 지정하면 경로와 브랜치를 예측할 수 있습니다. .claude/worktrees/update-page-title/ 폴더가 생기고, worktree-update-page-title 브랜치에서 세션이 시작됩니다. 이름을 생략하면(claude -w) Claude가 대화 맥락에서 자동으로 이름을 붙입니다.
A: 폴더만 분리하는 게 목적이라면 clone도 됩니다. 다만 .git이 폴더 수만큼 복제되어 디스크와 설정(hook·alias·credentials)도 그만큼 늘어납니다. 또 같은 브랜치를 두 폴더에서 동시에 꺼내도 git이 막아주지 않아 히스토리가 갈라질 위험이 있습니다. 같은 저장소의 여러 브랜치를 동시에 작업할 거라면 worktree가 더 가볍고 안전합니다
Q: git worktree를 만들면 디스크 공간이 두 배가 되나요?
A: .git 폴더는 공유하므로 저장소 히스토리가 복제되지는 않습니다. 파일 복사본만 추가되어 node_modules를 제외하면 수십 MB 수준입니다. 다만 worktree마다 bun install이 필요하므로 node_modules 크기가 누적될 수 있습니다. 사용이 끝난 worktree는 git worktree remove로 바로 정리하는 편이 좋습니다
Q: push 없이 세션을 종료하면 어떻게 되나요?
A: 커밋이나 변경이 있으면 Keep/Remove 프롬프트가 뜹니다. Keep을 선택하면 claude -w <name> --resume으로 이어갈 수 있고, Remove를 선택하면 로컬 변경이 사라집니다. 중요한 작업은 반드시 push하거나 PR로 올린 뒤에 종료합니다
Q: 이름을 지정하지 않고 claude -w만 실행하면 어떤 이름이 생성되나요?
A: Claude가 대화 맥락에서 적절한 이름을 자동으로 붙입니다. 명확한 주제가 있을 때는 이름을 직접 지정하는 편이 --resume으로 이어갈 때 찾기 쉽습니다
Q: 새 worktree에 .env 같은 환경 파일을 자동으로 가져가려면?
A: 프로젝트 루트에 .worktreeinclude 파일을 만들고 .gitignore와 같은 문법으로 복사할 파일을 지정합니다(.env, .env.local 등). 단, 해당 파일이 .gitignore에 포함된 상태여야 합니다. claude -w로 만든 worktree와 subagent worktree 모두에 적용됩니다
Q: worktree 생성·삭제 시점에 자동 셋업이 가능한가요?
A: .claude/settings.json에 WorktreeCreate/WorktreeRemove hook을 등록해 셸 스크립트를 실행할 수 있습니다. 단, WorktreeCreate를 직접 등록하면 기본 git 로직을 완전히 대체하므로 .env 복사 같은 셋업까지 훅 안에서 직접 처리해야 합니다(이 경우 .worktreeinclude는 적용되지 않습니다)
각 Claude에게 독립된 작업 폴더를 주는 방법을 익혔습니다. 다만 터미널을 두세 개까지는 양옆에 세워 두면 보이지만, 다섯 개 이상으로 늘어나면 어떤 세션이 입력을 기다리는지 시야 밖으로 빠집니다. 다음 레슨은 여러 백그라운드 세션을 한 화면에서 관리하는 Agent View 를 다룹니다.