여러 브랜치에서 Claude Code로 동시에 작업해야 할 때
Claude Code를 사용하다 보면, 여러 작업을 동시에 진행하고 싶어질 때가 있습니다. 보통 쏟아지는 이슈를 처리해야 할 때 이런 경우가 많지요. 😩
그럴 때 여러분은 어떻게 하시나요? 저는 기능 브랜치마다 git clone하고, 각 폴더마다 VS Code나 터미널을 띄우고 클로드한테 작업을 시키곤 했습니다.
브랜치마다 git clone하면 발생하는 문제
브랜치마다 클론하면 용량이 버티질 못한다
그런데 이 방법은 한계가 있습니다. 맥북의 디스크 용량이 금방 차버릴 거예요.
Git은 Svn같은 중앙 버전 관리 시스템이 아닌 분산 버전 관리 시스템입니다. 그래서 프로젝트를 클론 받으면 맥북에 프로젝트 전체 기록을 저장하게 됩니다.
같은 프로젝트를 3번 클론 받았다면, 맥북에 프로젝트 전체 기록을 3개 받은 거나 다름없게 됩니다.
생성한지 얼마 안된 프로젝트라면 큰 문제가 안되지만, 커밋이 많은 오래된 프로젝트라면 이는 큰 부담으로 다가옵니다.
거기다가 프로젝트를 하나만 진행하는 것도 아니고, 여러 프로젝트에 여러 브랜치마다 클론을 받는다면, 디스크 용량은 금방 버틸 수 없게 됩니다.
브랜치 간 컨텍스트 스위칭이 불편하다.
그리고 브랜치 간 왔다갔다 하는것도 불편합니다. 브랜치마다 VS Code를 열어놓을수 도 없고, 그렇다고 컨텍스트 스위칭할 때 마다 클론받은 경로로 이동해서 여는것도 상당히 귀찮습니다.
뭔가 체계화된, 용량도 효율적으로 관리하면서 버튼 한번 클릭으로 작업 브랜치 폴더를 손쉽게 열 방법이 없는 걸까요?
Git 워크트리(WorkTree)
다행히도, 좋은 방법이 있습니다. 바로 Git 워크트리입니다.
Git 워크트리는 하나의 로컬 저장소에서 여러 개의 작업 디렉터리를 동시에 체크아웃할 수 있게 해주는 기능입니다.
쉽게 말하면, 하나의 .git 폴더를 공유하면서 서로 다른 브랜치를 각각 다른 폴더에 펼쳐두는 방식입니다.
워크트리를 사용하는 경우의 폴더 구조.
예를 들면 이런 구조가 됩니다.
1my-project/ ← 메인 작업 디렉터리 (main 브랜치)
2my-project-feature-a/ ← 워크트리 (feature/a 브랜치)
3my-project-feature-b/ ← 워크트리 (feature/b 브랜치)
4"결국 브랜치마다 별도 폴더를 두는건 똑같지 않느냐?"라고 말씀하실 수 있는데, 그렇지 않습니다. 이렇게 하면, 메인 작업 디렉토리인 my-project에만 .git 폴더가 있습니다.
그래서 커밋이 많은 오래된 프로젝트일지라도 브랜치마다 워크트리를 만들어서 클로드 코드로 작업해도 디스크 압박이 덜합니다.
워크트리에는 .git이라는 이름의 파일이 생성됩니다.
이름이 같긴 한데, 워크트리에 있는건 텍스트 파일입니다. 안에는 아래와 같이 메인 저장소를 가리키는 포인터가 들어 있습니다.
1gitdir: /Users/scra/Desktop/workspace/malloc72p/temp/.git/worktrees/temp-a
2또한 워크트리로 관리하면 같은 .git 폴더의 히스토리를 바라보기 때문에, git fetch한번만 하면 메인 작업 디렉터리를 포함하여 모든 워크트리가 저장소 전체의 상태를 일관되게 볼 수 있습니다.
워크트리 만들기
먼저 실습을 위한 리포지터리를 생성하겠습니다. 원하는 경로에서 아래 명령어를 순서대로 실행합니다.
1# temp라는 이름의 폴더 생성
2mkdir temp
3
4# temp 폴더로 이동
5cd temp
6
7# git repository 생성
8git init
9
10# 커밋 생성
11touch something
12git add *
13git commit -m "init"
14
15# 워크트리 생성
16git worktree add -b temp-a ../temp-a
17git worktree add 명령어로 워크트리를 생성합니다. -b 옵션을 통해 temp-a라는 브랜치를 생성하고, 부모 폴더 밑에 temp-a라는 폴더를 만들고 여기를 워크트리를 위한 폴더로 사용합니다.
만약 이미 브랜치가 있는 경우라면 -b 옵션을 사용하지 않아도 됩니다.
워크트리 목록을 보려면 아래와 같이 git worktree list 명령어를 실행하면 됩니다.
1git worktree list
2temp-a라는 브랜치에 대한 워크트리 경로가 /workspace/temp-a임을 알 수 있습니다.
1출력 결과
2/workspace/temp 7dd1e8a [main]
3/workspace/temp-a 7dd1e8a [temp-a]
4- 7dd1e8a는 커밋의 해시코드입니다. 해당 워크트리가 어떤 커밋에 있는지를 보여줍니다.
워크트리 삭제하기
git worktree remove 명령어로 워크트리를 삭제할 수 있습니다.
1git worktree remove temp-a
2git worktree list
31출력 결과
2/workspace/temp 7dd1e8a [main]
3이렇게 워크트리를 삭제하면 해당 폴더도 같이 삭제됩니다. 단, 해당 워크트리에서 아직 커밋되지 않은 내용이 있는 경우 삭제가 실패할 수 있으니 주의해주세요.
VS Code Extension으로 편하게 관리하기
그럼 용량 문제는 해결되었는데, 컨텍스트 스위칭 문제는 어떨까요? 일단 워크트리를 편하게 추가, 삭제할 수 있어야 하고, 컨텍스트 스위칭도 편해야 쓸텐데, 이는 VS Code 익스텐션을 사용하면 해결됩니다.
해당 익스텐션을 설치하고 나면 WorkTree List라는 패널이 생깁니다.
"제 블로그 프로젝트의 워크트리 현황입니다."
귀찮게 터미널에서 명령어를 치지 않아도 해당 프로젝트의 모든 워크트리 현황을 보여주며, GUI를 통해 워크트리를 추가하거나 삭제하는 기능도 제공하니 매우 편리합니다.
다른 워크트리로 전환하고 싶다면, 목록에서 원하는 워크트리를 클릭하기만 하면 바로 해당 워크트리로 VS Code가 열립니다.
앞의 실습에서 했던 것처럼 매번 터미널 명령어를 입력하지 않아도 됩니다.
위와 같이 워크트리를 관리하면 원하는 브랜치를 클릭 몇번으로 전부 열고, 해당 폴더에서 Claude Code CLI나 VS Code의 Claude Code Extension으로 작업을 지시할 수 있어서 편합니다.
또한 전체 워크트리의 커밋 상황도 한눈에 볼 수 있는데요, VS Code의 기본 기능인 Source Control은 해당 저장소의 모든 워크트리를 인식하여 변경 사항을 표시해줍니다.
"VS Code의 Source Control 기능으로 워크트리의 모든 변경사항을 한눈에 보여주는 모습"
마치며
Git의 워크트리 기능을 활용하여 기능 브랜치마다 워크트리를 만들고 관리한다면, 디스크 용량을 아끼면서 Claude Code에게 작업을 지시할 수 있어 매우 유용합니다.
또한 VS Code의 Extension 기능을 사용하면, 한곳에서 GUI로 워크트리 현황을 보고 관리할 수 있어 편리하기까지 합니다.
AI가 도입되면서 편해지기도 했지만 그 만큼 업무량이 늘어 많이 힘드실텐데, Git의 워크트리 기능을 통해 조금 짐이 덜어졌으면 합니다.
이상 Git 워크트리에 대한 포스트였습니다. 감사합니다.