메인 콘텐츠로 건너뛰기
git worktree는 자체 파일과 브랜치를 가진 별도의 작업 디렉터리이며, 메인 체크아웃과 동일한 저장소 히스토리 및 원격을 공유합니다. 각 Claude Code 세션을 자체 worktree에서 실행하면 세션마다 편집할 파일의 별도 사본이 주어지므로, 한 세션이 기능을 구축하는 동안 두 번째 세션이 버그를 수정할 수 있습니다.
다른 버전 관리 시스템이나 데스크톱 앱을 사용하는 경우 해당 환경에 맞는 지침을 따릅니다.
Worktree는 Claude를 병렬로 실행하는 여러 방법 중 하나입니다. 이들은 파일 편집을 격리합니다. 서브에이전트는 한 세션 내에서 작업을 분할하고, 크로스 세션 메시징을 통해 Claude는 worktree의 세션 간에 발견 사항을 전달할 수 있습니다. Claude를 병렬로 실행을 참조하여 접근 방식을 비교하거나, worktree로 서브에이전트 격리로 건너뛰어 worktree와 서브에이전트를 함께 사용합니다. 대부분의 세션은 처음 두 섹션만 필요합니다: worktree에서 Claude 시작, 그 다음 종료 시 정리. 세션 재개, worktree 생성 방식 변경 또는 실패 디버깅이 필요할 때 페이지의 나머지 부분으로 돌아갑니다.

worktree에서 Claude 시작

--worktree 또는 -w를 이름과 함께 전달하여 격리된 worktree를 생성하고 Claude를 시작합니다. 기본적으로 worktree는 저장소 루트의 .claude/worktrees/<name>/ 아래에 생성되며, worktree-<name>이라는 새 브랜치에 생성됩니다:
다른 터미널에서 다른 이름으로 명령을 다시 실행하여 두 번째 격리된 세션을 시작합니다. 이름을 생략하면 Claude가 bright-running-fox와 같은 이름을 생성합니다. 대화형 실행에는 작업 공간 신뢰가 필요합니다. 이전에 디렉토리에서 Claude를 실행하지 않았다면 해당 디렉토리에서 claude를 한 번 실행하여 신뢰 대화를 수락하거나, --worktree는 오류와 함께 종료되고 먼저 이를 수행하도록 요청합니다. -p를 사용한 비대화형 실행은 신뢰 확인을 건너뛰므로 claude -p --worktree는 이를 수행하지 않고 진행됩니다.
.claude/worktrees/를 .gitignore에 추가하여 worktree 내용이 메인 체크아웃에서 추적되지 않은 파일로 나타나지 않도록 합니다.

worktree 환경 설정

Worktree는 새로운 체크아웃이므로 개발 환경을 초기화합니다. Claude에게 종속성을 설치하도록 요청하거나, .claude/worktrees/ 아래의 worktree 디렉토리에서 프로젝트의 설정을 직접 실행합니다. .env와 같은 gitignored 파일을 모든 새 worktree로 자동으로 전달하려면 .worktreeinclude 파일을 추가합니다.

Claude에게 worktree 생성 요청

세션 중에 Claude에게 “worktree에서 작업하기”를 요청할 수도 있으며, EnterWorktree 도구로 하나를 생성합니다. Worktree에 들어가면 Claude는 .claude/worktrees/ 아래의 다른 worktree로 EnterWorktree를 호출하여 직접 전환할 수 있습니다. 이전 worktree는 디스크에 그대로 남아 있습니다. Claude가 저장소의 .claude/worktrees/ 디렉터리 외부의 경로에 들어가면 Claude Code는 먼저 승인을 요청합니다. 이 이동은 세션의 작업 디렉터리, 쓰기 액세스 및 CLAUDE.md 및 설정과 같은 프로젝트 구성을 해당 위치��� 옮깁니다. EnterWorktree 권한 규칙 또는 “다시 묻지 않기”를 선택해도 이 프롬프트를 억제하지 않습니다. bypassPermissions 모드만 이를 건너뜁니다.
훅 경로는 worktree를 따르지 않습니다. Claude가 worktree에 들어간 후 Claude Code는 훅에서 ${CLAUDE_PROJECT_DIR}을 원래 위치에 유지하고 worktree 경로를 다른 방식으로 전달합니다:
  • ${CLAUDE_PROJECT_DIR} 유지: 세션이 시작된 프로젝트 루트를 계속 가리키므로 ${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh와 같은 훅 명령은 메인 체크아웃에서 스크립트를 실행합니다.
  • cwd는 Claude를 따릅니다: 훅의 입력 JSON의 cwd 필드는 worktree 루트이며, Claude가 cd를 실행할 때 다시 이동합니다. 훅이 worktree 경로가 필요할 때 읽습니다.

worktree 정리

대화형 worktree 세션을 종료할 때 Claude는 worktree에서 제거로 인해 삭제될 작업을 확인합니다: 변경되거나 추적되지 않은 파일, 체크아웃된 서브모듈 내의 커밋되지 않은 작업, 그리고 새로운 커밋입니다. 이러한 규칙은 Claude가 git으로 생성한 worktree에 적용됩니다. WorktreeCreate 훅이 생성한 worktree의 경우 대신 WorktreeRemove를 참조하십시오.
  • Worktree가 깨끗함: 이름 없는 세션의 경우 Claude는 worktree와 해당 브랜치를 자동으로 제거합니다. 이름이 지정된 세션은 나중을 위해 worktree를 유지할 수 있도록 먼저 프롬프트를 표시합니다.
  • Worktree에 작업이 있음: Claude는 worktree를 유지하거나 제거할지 묻습니다. 유지하면 디렉토리와 브랜치가 보존됩니다. 나중에 돌아오려면 Claude Code가 종료 시 출력하는 claude --worktree <name> --resume 명령을 실행합니다. 제거하면 worktree 디렉토리와 해당 브랜치가 삭제되며, 그 안의 모든 작업도 함께 삭제됩니다
  • 다른 브랜치가 체크아웃되어 있음: worktree가 자체 브랜치가 아닌 다른 브랜치에 있고 그 브랜치에 worktree의 시작 커밋 이후의 커밋이 있는 경우, Claude는 worktree를 유지하거나 제거할지 묻습니다. 어느 쪽을 선택하든 해당 다른 브랜치와 그 커밋은 유지됩니다. 제거하면 worktree 디렉토리와 worktree 자체의 브랜치, 즉 Claude가 worktree와 함께 생성한 브랜치가 삭제됩니다
  • Worktree의 상태를 확인할 수 없음: Claude Code가 worktree의 변경 사항을 계산할 수 없거나 서브모듈 체크아웃을 검사할 수 없을 때, worktree를 자동으로 제거하지 않고 프롬프트를 표시합니다. 프롬프트는 확인할 수 없었던 항목을 명시합니다.
-p를 사용한 비대화형 실행에는 종료 프롬프트가 없으므로 Claude는 해당 worktree를 정리하지 않으며, Claude Code는 생성 시 각 worktree에 대해 가져온 잠금을 유지합니다. 나중 세션의 stale-lock sweep이 이를 해제할 때까지 유지됩니다. 하나를 제거하려면 git worktree remove를 실행합니다. git이 worktree가 잠겨 있다고 거부하면 먼저 git worktree unlock을 실행합니다. Windows에서 worktree를 제거해도 worktree 외부의 파일은 삭제되�� 않습니다. Worktree 내부의 폴더가 다른 곳으로의 링크(예: NTFS 접합점 또는 디렉토리 심볼릭 링크)인 경우 Claude Code는 링크만 삭제합니다.

worktree 세션 재개

worktree를 종료하지 않고 끝난 세션을 재개할 때 Claude Code는 세션을 해당 worktree로 반환합니다. 이는 대화형 재개, 비대화형 모드에서 -p를 사용한 --continue 및 --resume, 그리고 Agent SDK에 적용됩니다. --continue는 실행한 디렉토리 아래에 기록된 가장 최근 세션을 선택합니다. Worktree 내부로 돌아가면 Claude는 여전히 ExitWorktree 도구로 이를 종료할 수 있습니다. Claude Code가 세션을 worktree로 반환하기 전에 worktree가 여전히 메인 체크아웃과 별도의 체크아웃인지 확인하고, 확인에 실패한 worktree로 다시 들어가기를 거부합니다. Git worktree의 경우 확인은 git 메타데이터를 읽습니다. WorktreeCreate 훅이 생성한 것과 같은 git 메타데이터가 없는 worktree는 확인을 통과할 수 있습니다. Claude Code가 여전히 거부하는 경우는 Claude Code가 worktree 사용을 거부에 나열되어 있으며 복구 방법도 함께 제시됩니다. 메시지 및 각각에서 복구하는 방법은 세션이 worktree 외부에서 재개를 참조합니다. 실행 위치와 재개 방식에 따라 Claude Code가 다시 들어가는 것이 변경됩니다:
  • 실행 디렉토리: 메인 체크아웃 또는 저장소의 다른 디렉토리에서 --resume으로 재개합니다. Claude Code는 실행 위치 내부에서 실행하더라도 .claude/worktrees/ 아래에서 git으로 생성한 worktree로 다시 들어갑니다. 다른 worktree 내부에서 실행할 때 Claude Code는 거기서 이를 보증할 수 있는 경우에만 다시 들어갑니다: 자체 저장소인 worktree, git 메타데이터가 없는 worktree, 또는 git worktree add로 생성한 worktree의 서브디렉토리에서 실행하면 거부되므로 메인 체크아웃에서 실행합니다.
  • --fork-session: 포크된 세션은 Claude를 실행한 디렉토리에서 시작하며 Claude Code는 원본 세션의 worktree를 그대로 둡니다.
  • 삭제된 worktree: worktree 디렉토리가 더 이상 존재하지 않으면 Claude Code는 Claude를 실행한 디렉토리에서 세션을 재개합니다. Worktree가 없어졌음을 알려주고 세션의 worktree 바인딩을 지웁니다.
v2.1.212 이전에는 비대화형 재개가 시작 디렉토리에 머물렀고 ExitWorktree는 활성 worktree 세션이 없다고 보고했습니다.
Claude가 Claude Code가 git으로 생성한 worktree에 들어가거나 나갈 때 트랜스크립트도 함께 따라갑니다. Claude Code는 /cd와 동일한 방식으로 세션의 새로운 작업 디렉터리 아래에 세션을 기록하므로 /desktop과 --resume이 거기서 이를 찾습니다. 나가면 같은 방식으로 다시 이동합니다. WorktreeCreate 훅으로 생성된 worktree는 시작 디렉터리에 트랜스크립트를 유지합니다.

Claude Code가 격리를 강제하는 방식

세션이 worktree에 격리되어 있는 동안 Claude Code는 아래 확인이 정의하는 도구 호출을 차단합니다. --worktree로 세션을 시작했든, Claude가 EnterWorktree로 worktree에 들어갔든, 또는 worktree 세션을 재개했든 동일한 규칙이 적용됩니다. 동일한 강제는 격리된 세션에서 생성하는 모든 서브에이전트를 포함합니다. 세션이 대화형이든 백그라운드에서 실행되든 적용됩니다. 자체 worktree에서 실행되는 서브에이전트는 동일한 확인을 수행합니다. 해당 버전 히스토리는 서브에이전트 파일 작성 아래에 있습니다. Claude Code는 네 가지 확인을 적용합니다:
  • 파일 편집: Claude Code는 메인 체크아웃의 경로를 대상으로 하는 Edit, Write 또는 NotebookEdit을 차단합니다.
  • 명령 작업 디렉토리: Claude Code는 작업 디렉토리가 메인 체크아웃으로 확인되거나 그 외부에 머물러 있는지 확인할 수 없는 Bash, PowerShell 또는 Monitor 명령을 차단합니다.
  • Git 리다이렉트: Claude Code는 git을 메인 체크아웃으로 리다이렉트하는 Bash 또는 Monitor 명령을 차단합니다. 리다이렉트는 git -C, --git-dir, GIT_DIR 또는 GIT_WORK_TREE 변수, 또는 git을 실행하기 전에 메인 체크아웃으로 cd를 통해 올 수 있습니다.
  • 명령 형태: Claude Code는 명령 텍스트에서 명령이 실행하는 모든 git이 worktree 내부에 머물러 있는지 확인할 수 없을 때 Bash 또는 Monitor 명령을 차단합니다. 예를 들어 명령 이름이 런타임에 계산되거나 구문을 파싱할 수 없거나 ${!name} 또는 ${ command; }와 같은 확장이 텍스트에서 명시하지 않은 명령을 실행할 수 있을 때 발생합니다. Claude Code는 Claude에게 거부된 명령을 다시 작성하는 방법을 알려줍니다. 예를 들어 이를 일반 별도 명령으로 분할합니다. 이 확인을 끌 수 없습니다.
이러한 확인은 편집이 대상으로 하는 경로, 명령이 실행되는 디렉터리, 명령의 텍스트를 읽습니다. 어느 확인도 셸 명령이 어떤 파일에 쓰는지는 추적하지 않으므로, cp나 셸 리다이렉트처럼 메인 체크아웃에서 git을 실행하지 않고 메인 체크아웃에 쓰는 명령은 이 확인으로 거부되지 않습니다. Claude Code는 이러한 명령을 권한 및 샌드박싱 설정에 따라 다른 셸 명령과 동일하게 취급합니다. 확인은 Claude Code를 실행한 저장소에 적용됩니다. 또한 연결된 worktree가 연결된 메인 체크아웃도 포함합니다. PowerShell 명령의 경우 Claude Code는 작업 디렉토리 확인만 적용합니다. Claude는 각 거부를 worktree의 이름을 지정하고 진행 방법을 설명하는 도구 오류로 봅니다. 거부된 명령의 경우 거부 메시지의 의미와 이를 해결하는 방법을 참조하세요.

worktree로 서브에이전트 격리

서브에이전트는 자체 worktree에서 실행될 수 있으므로 병렬 편집이 충돌하지 않습니다. Claude에게 “에이전트에 worktree 사용”을 요청하거나, 사용자 정의 서브에이전트에 대해 frontmatter에 isolation: worktree를 추가하여 격리를 영구적으로 만듭니다. .claude/agents/의 이 서브에이전트는 항상 자체 worktree에서 실행됩니다:
각 서브에이전트는 서브에이전트가 변경 없이 완료되면 Claude Code가 자동으로 제거하는 임시 worktree를 가져옵니다. 변경 사항이 있는 worktree는 아래의 주기적 스윕이 작업을 잃지 않고 제거할 수 있을 때까지 디스크에 유지됩니다. WorktreeCreate 훅이 생성한 worktree의 경우 대신 WorktreeRemove를 참조하세요. 서브에이전트 worktree는 --worktree와 동일한 기본 브랜치를 사용하므로, worktree.baseRef가 "head"로 설정되지 않은 한 저장소의 기본 브랜치에서 분기합니다. 자체 worktree에 있는 서브에이전트는 시작 시 로드하는 지침 파일을 자신의 worktree가 아닌 기본 대화에서 가져옵니다. 해당 worktree가 .claude/worktrees/ 아래의 기본 위치에 있으면, 서브에이전트는 worktree의 파일을 읽을 때 worktree 루트에 있는 CLAUDE.md 파일이나 .claude/rules/ 디렉터리도 로드하지 않습니다. 이는 해당 파일이 worktree의 브랜치에서 다르더라도 마찬가지입니다.

서브에이전트 및 백그라운드 세션 worktree 정리

Claude Code는 Claude가 서브에이전트 및 백그라운드 세션을 위해 생성한 worktree를 cleanupPeriodDays 설정보다 오래되면 제거하는 주기적 스윕을 실행하며, 보존 스윕 규칙을 따릅니다. --worktree 세션을 백그라운드로 보낼 때 해당 worktree는 스윕이 제거할 수 있는 백그라운드 세션 worktree가 됩니다. 스윕은 다음 경우에 worktree를 제자리에 둡니다:
  • Worktree가 여전히 작업을 보유하고 있습니다: 변경되거나 추적되지 않은 파일, 또는 푸시되지 않은 커밋.
  • worktree의 체크아웃된 서브모듈이 변경되거나 추적되지 않은 파일을 보유하고 있거나, Claude Code가 worktree의 서브모듈을 검사할 수 없습니다. 이 확인에는 Claude Code v2.1.274 이상이 필요합니다.
  • worktree 생성을 차단하는 네 가지 경우 중 하나가 적용됩니다: Claude Code가 저장소 구성이 정의하는 필터 드라이버를 결정할 수 없거나, 여기서 전환할 수 없는 설정을 찾습니다.
  • Worktree가 백그라운드하지 않은 --worktree 세션에 속합니다. 나이와 관계없이.
  • git worktree add로 직접 worktree를 생성했습니다. 나중에 --worktree <name> 세션을 실행하고 해당 세션을 백그라운드했더라도.
Claude Code는 생성하는 모든 git worktree에 git 메타데이터에 마커를 작성하며, 스윕은 마커가 없는 worktree를 유지합니다. WorktreeCreate 훅이 생성한 worktree를 포함합니다.

Worktree 잠금 및 수동 제거

에이전트가 실행 중인 동안 Claude Code는 해당 worktree에서 git worktree lock을 유지하여 동시 정리가 이를 제거할 수 없도록 하며, 에이전트가 완료되면 잠금을 해제합니다. Claude Code는 백그라운드된 세션을 위해 생성한 worktree에서 세션이 실행되는 동안 동일한 잠금을 유지하므로 스윕은 worktree를 제자리에 두고 git worktree remove는 이를 제거하기를 거부합니다. 스윕은 또한 프로세스가 종료된 세션을 위해 Claude Code가 설정한 잠금을 해제하므로 종료된 백그라운드 세션은 worktree를 영구적으로 잠긴 상태로 두지 않습니다. 스윕은 git worktree lock으로 직접 설정한 잠금을 절대 해제하지 않습니다. 스윕이 유지하는 worktree를 정리하려면 git worktree remove를 실행하고, worktree에 커밋되지 않은 변경 사항이나 추적되지 않은 파일이 있으면 --force를 추가합니다. Git이 worktree가 잠겨 있다고 거부하면 먼저 git worktree unlock을 실행합니다.

worktree 생성 사용자 정의

Claude Code의 worktree 생성 기본값은 대부분의 세션을 포함합니다: .claude/worktrees/ 아래에 생성하고, 저장소의 기본 브랜치에서 분기하며, 추적된 파일만 체크아웃합니다. 이 섹션의 옵션은 이러한 기본값을 변경합니다.

기본 브랜치 선택

새 worktree는 저장소의 기본 브랜치에서 분기하므로 대부분의 세션은 이 설정이 필요하지 않습니다. 설정에서 worktree.baseRef를 설정하여 현재 작업에서 분기합니다. 설정은 두 가지 값을 허용합니다:
  • "fresh" (기본값): 원격의 저장소 기본 브랜치(보통 main)에서 분기하므로 worktree는 원격과 일치하는 깨끗한 트리에서 시작합니다.
  • "head": 현재 로컬 HEAD에서 분기하므로 worktree는 푸시되지 않은 커밋과 기능 브랜치 상태를 유지합니다. 진행 중인 작업에서 작동해야 하는 서브에이전트를 격리할 때 사용합니다. Worktree 내부에서 "head"는 메인 체크아웃의 HEAD가 아닌 해당 worktree의 HEAD로 확인됩니다.
worktree.baseRef를 브랜치 이름으로 설정할 수 없습니다. 특정 기존 브랜치에서 worktree를 시작하려면 git으로 직접 생성합니다. "fresh" 기본의 경우 Claude Code는 origin/HEAD를 최신으로 유지합니다:
  • 저장소를 지난 24시간 동안 페치하지 않았으면 기본 브랜치를 페치하며, 5초로 제한되고 페치가 실패하면 로컬로 캐시된 ref를 사용합니다.
  • 페치는 터미널에서 입력을 기다리지 않습니다. git 또는 ssh가 비밀번호, 키 암호 또는 새 SSH 호스트 확인을 요청하는 경우에도 실패한 것으로 간주됩니다.
  • 원격이 구성되지 않았거나 origin/HEAD가 로컬로 캐시되지 않았고 페치할 수 없으면 worktree는 현재 로컬 HEAD로 폴백합니다.
이 예제는 모든 새 worktree가 현재 작업에서 분기하도록 만듭니다:

풀 요청에서 분기

특정 풀 요청 또는 병합 요청에서 분기하려면 --worktree에 #이 앞에 붙은 번호, GitHub 풀 요청 URL 또는 https://gitlab.com/group/repo/-/merge_requests/123과 같은 GitLab 병합 요청 URL을 전달합니다. Claude Code는 origin에서 해당 변경의 헤드 커밋을 페치하고 .claude/worktrees/pr-<number>에서 worktree를 생성합니다. 셸이 #을 주석의 시작으로 취급하지 않도록 인수를 인용합니다:
Claude Code는 URL에서 번호만 읽습니다. 항상 저장소의 origin 원격에서 페치하며, origin의 호스트로 페치 경로를 선택합니다:
  • github.com: pull/<number>/head 페치
  • gitlab.com: merge-requests/<number>/head 페치
  • GitHub Enterprise, 자체 관리 GitLab 또는 기타 호스트: 먼저 pull/<number>/head를 시도한 다음 merge-requests/<number>/head를 시도
이 페치는 터미널에서 입력을 기다리지 않습니다. git 또는 ssh가 비밀번호, 키 암호 또는 새 SSH 호스트 확인을 요청하는 경우 대신 페치가 실패하고 Claude Code는 Error creating worktree: Failed to fetch PR/MR #<number> 메시지와 함께 종료됩니다. ssh-agent가 보유한 키는 여전히 작동하므로, 시작하기 전에 키를 그곳에 로드하고 git fetch를 한 번 직접 실행하여 새 호스트를 기록합니다. v2.1.233 이전에는 Claude Code가 --worktree에 대해 #<number> 및 GitHub 스타일 풀 요청 URL만 허용했으며, 항상 pull/<number>/head를 페치했습니다.

gitignored 파일을 worktree로 복사

Worktree는 새로운 체크아웃이므로 메인 저장소의 .env 또는 .env.local과 같은 추적되지 않은 파일이 없습니다. Claude가 worktree를 생성할 때 자동으로 복사하려면 프로젝트 루트에 .worktreeinclude 파일을 추가합니다. 파일은 .gitignore 구문을 사용합니다. 패턴과 일치하고 gitignored된 파일만 복사되므로 추적된 파일은 절대 중복되지 않습니다. **/로 시작하는 패턴을 작성하고 원하는 파일이 전체적으로 gitignored된 디렉토리 내부에 있으면 Claude Code는 해당 디렉토리 자체가 패턴과 일치하거나 **/ 후의 첫 번째 이름이 디렉토리 경로의 이름 중 하나일 때만 복사합니다. 예를 들어 **/.claude/skills/*.md를 작성하면 첫 번째 이름은 .claude이므로 Claude Code는 무시된 .claude/ 디렉토리에서 일치하는 파일을 복사합니다. **/ 패턴이 도달하지 않는 무시된 디렉토리에서 파일을 복사하려면 패턴에서 디렉토리의 이름을 지정합니다: **/config.json 대신 vendor/**/config.json을 작성합니다. v2.1.239 이전에는 Claude Code가 디렉토리 자체가 패턴과 일치할 때만 **/ 패턴에 대해 전체적으로 무시된 디렉토리에서 파일을 복사했습니다. 이 .worktreeinclude는 두 개의 env 파일과 시크릿 구성을 각 새 worktree로 복사합니다:
.worktreeinclude
이는 Claude Code가 git으로 생성하는 모든 worktree에 적용됩니다: --worktree worktree, 서브에이전트 worktree 및 데스크톱 앱의 병렬 세션. WorktreeCreate 훅을 사용하면 훅 스크립트 내에서 파일을 복사합니다.

worktree 이름 재사용

--worktree에 전달한 이름의 worktree가 이미 존재하면 Claude Code는 새로운 worktree를 생성하는 대신 기존 worktree를 엽니다. Claude Code가 belongs to a different repository 또는 is a leftover worktree가 포함된 오류와 함께 중지되면 worktree 디렉토리가 belongs to a different repository를 참조합니다. 기본 "fresh" 기본을 사용하면 다음 모든 조건이 충족될 때 재개된 worktree는 이전 팁에서 계속하는 대신 저장소의 기본 브랜치로 재설정됩니다:
  • 커밋되지 않은 변경 사항이나 추적되지 않은 파일이 없습니다.
  • 여전히 Claude Code가 생성한 브랜치에 있습니다.
  • 자체 커밋이 없거나 풀 요청 또는 병합 요청이 병합되고 원격 브랜치가 삭제되었습니다.
Claude Code는 git 상태만으로 병합된 경우를 감지합니다: worktree가 푸시한 원격 브랜치가 더 이상 존재하지 않으며, worktree의 모든 커밋이 이미 기본 브랜치에 있습니다. 다른 모든 경우에 Claude Code는 worktree를 이전 팁에서 재개합니다:
  • Worktree가 조건 중 하나라도 실패합니다.
  • Claude Code가 worktree의 상태를 확인할 수 없습니다.
  • worktree.baseRef가 "head"입니다.
  • 이름이 풀 요청 또는 병합 요청 참조입니다.

worktree 생성을 훅으로 대체

WorktreeCreate 훅을 구성하여 기본 git worktree 로직을 완전히 대체합니다. 여기에는 worktree를 .claude/worktrees/ 이외의 다른 곳에 배치하는 것도 포함됩니다. 완전한 예제는 비git 버전 관리를 참조합니다.

worktree가 메인 체크아웃과 공유하는 것

Worktree는 자체 파일과 브랜치를 가지지만 메인 체크아웃과 다음을 공유합니다:
  • 저장소의 .git 디렉토리: worktree의 git 명령은 메인 저장소의 공유 .git 디렉토리에 쓰며, 샌드박싱은 이러한 쓰기를 허용하므로 git commit과 같은 명령이 샌드박스가 활성화된 worktree 내부에서 작동합니다.
  • 플러그인: 프로젝트 범위에서 메인 체크아웃에서 설치된 플러그인도 동일한 저장소의 worktree에 로드되므로 worktree마다 다시 설치할 필요가 없습니다.
  • 권한 승인: worktree 세션에서 Bash 명령에 대해 “예, 다시 묻지 않기”를 선택하면 규칙이 메인 체크아웃의 .claude/settings.local.json에 저장됩니다. 이 규칙은 메인 체크아웃과 저장소의 다른 모든 worktree에 적용되며, worktree 제거 후에도 유지됩니다. Windows 및 Claude Code가 저장소 루트를 사용하지 않는 다른 경우에는 규칙이 해당 worktree와 함께 유지됩니다. 승인이 저장되는 위치를 참조합니다.
  • 추적되지 않은 skills, agents, 및 commands: worktree 체크아웃에 루트에 .claude/skills 디렉토리가 없을 때(예: .claude/skills가 gitignored인 경우), Claude Code는 메인 체크아웃의 프로젝트 skills를 worktree 세션에 로드합니다. 자체 .claude/skills 디렉토리가 있는 worktree에서는 해당 복사본만 로드됩니다. 동일한 읽기 통과는 .claude/agents 및 .claude/commands를 포함합니다. Skills의 경우 읽기 통과에는 Claude Code v2.1.277 이상이 필요합니다.
이 모든 것들은 --worktree로 worktree를 생성했든, git worktree add로 생성했든 적용됩니다. 데스크톱 앱에서 시작한 worktree 세션에서 Claude Code는 설정, 훅, 스킬, 에이전트, 명령, .mcp.json 서버와 같은 프로젝트 구성을 메인 체크아웃의 루트에서 읽습니다. 훅 명령은 해당 루트에서 실행되며, ${CLAUDE_PROJECT_DIR}는 해당 루트를 가리킵니다. Claude가 작업 중인 파일에 접근하려면 훅의 cwd 입력 필드에서 worktree의 경로를 읽습니다. CLAUDE.md 파일과 .claude/rules/는 여전히 worktree에서 로드됩니다.

worktree 수동 관리

특정 기존 브랜치를 체크아웃하거나 worktree를 저장소 외부에 배치해야 할 때 Git으로 직접 worktree를 생성합니다. 새 브랜치에서 worktree 생성:
기존 브랜치에서 worktree 생성. fix-issue-456을 저장소에 이미 존재하는 브랜치로 바꿉니다:
worktree에서 Claude 시작:
worktree 나열:
완료되면 제거:
전체 명령 참조는 Git worktree 문서를 참조합니다.

비git 버전 관리

Worktree 격리는 기본적으로 git을 사용합니다. SVN, Perforce, Mercurial 또는 기타 시스템의 경우 WorktreeCreate 및 WorktreeRemove 훅을 구성하여 사용자 정의 생성 및 정리 로직을 제공합니다. 훅이 기본 git 동작을 대체하므로 --worktree를 사용할 때 .worktreeinclude가 처리되지 않습니다. 훅 스크립트 내에서 대신 로컬 구성 파일을 복사합니다. 이 WorktreeCreate 훅은 stdin에서 jq를 사용하여 worktree 이름을 읽고, 새로운 SVN 작업 복사본을 체크아웃하고, Claude Code가 세션의 작업 디렉토리로 사용할 수 있도록 디렉토리 경로를 인쇄합니다. settings.json에 구성을 추가합니다:
세션이 끝날 때 정리하려면 WorktreeRemove 훅과 쌍을 이룹니다. 입력 스키마 및 제거 예제는 훅 참조를 참조합니다. WorktreeCreate 훅을 사용하면 git 저장소 외부에서 /batch를 실행할 수도 있습니다. 각 /batch 서브에이전트는 프로젝트의 버전 관리 명령으로 변경 사항을 게시하고, 풀 요청을 열 수 없을 때 대신 게시한 내용을 보고합니다. git 저장소 외부에서 /batch를 실행하려면 Claude Code v2.1.281 이상이 필요합니다.

문제 해결

Claude Code는 워크트리를 생성할 때, 시작 시 워크트리에 진입할 때, 또는 재개된 세션을 워크트리로 되돌릴 때 아래 오류를 보고합니다.

Claude Code가 시작 시 워크트리에 진입할 수 없음

Claude Code가 시작 시 워크트리 디렉터리에 진입할 수 없으면 해당 경로를 명시한 오류를 출력하고 코드 1로 종료합니다. 이는 WorktreeCreate 훅이 생성한 디렉터리가 아닌 다른 내용을 출력하거나, 디렉터리가 설정된 후 삭제된 경우에 발생할 수 있습니다.

심볼릭 링크 경로에서 워크트리 생성 실패

Claude Code는 .claude, .claude/worktrees 또는 워크트리 디렉터리 자체가 심볼릭 링크인 경우 워크트리 생성을 거부하며, 오류에는 심볼릭 링크 경로가 명시됩니다. 심볼릭 링크를 제거하고 재시도하십시오. v2.1.212 이전에는 저장소에 해당 경로 중 하나에 커밋된 심볼릭 링크가 이미 있으면 워크트리 생성 시 이를 따라가 저장소 외부에 파일을 생성할 수 있었습니다.

Claude Code가 생성한 워크트리에 대체된 객체의 원본 내용이 있음

저장���에서 git replace를 사용하는 경우, Claude Code가 생성한 워크트리의 파일에는 refs/replace/ 항목이 지정하는 대체 내용이 아닌 원본 객체의 내용이 들어 있습니다. Claude Code는 워크트리의 파일을 체크아웃하는 git 명령을 GIT_NO_REPLACE_OBJECTS=1로 실행하며, 사용자가 해당 변수에 export한 값은 무시합니다. 대체된 내용을 얻으려면 git worktree add로 워크트리를 직접 생성하고 그 안에서 Claude Code를 시작하십시오.

Claude Code가 생성한 워크트리에서 Git LFS 파일이 포인터 파일임

git lfs install --local로 Git LFS를 설정한 경우, Claude Code가 생성한 워크트리에는 실제 파일 대신 LFS 포인터 파일이 들어 있습니다. --local 플래그는 LFS 필터를 전역 git 구성이 아닌 저장소 자체의 .git/config에 기록합니다. 일반 git lfs install은 전역 구성에 기록하므로 영향을 받지 않습니다. 저장소 자체 구성에 정의된 다른 필터 드라이버에도 동일하게 적용됩니다. 필터 드라이버는 셸 명령이며, Claude를 포함해 저장소에 쓸 수 있는 모든 주체가 이를 넣었을 수 있으므로 Claude Code는 워크트리를 생성할 때 저장소 자체의 필터 드라이버를 건너뜁니다. v2.1.247 이전에는 Claude Code가 워크트리 생성 중에 해당 드라이버를 실행했습니다. 실제 파일을 얻으려면 워크트리 안에서 git lfs pull을 실행하십시오. 드물게 네 가지 경우에는 Claude Code가 워크트리를 전혀 생성하지 않습니다. 저장소 구성이 어떤 필터 드라이버를 정의하는지 판단할 수 없거나, 구성에서 끌 수 없는 설정을 발견한 경우입니다. 오류에 맞는 해결 방법을 찾으십시오.
  • Could not read the repository git config to neutralize filter drivers: 권한 문제 등으로 Claude Code가 저장소의 .git/config를 읽을 수 없었습니다. 이를 해결하고 재시도하십시오.
  • The repository git config defines a filter driver whose name cannot be neutralized (contains "=" or a newline): .git/config에서 해당 필터 드라이버의 이름을 변경하거나 제거한 후 재시도하십시오.
  • The repository git config has a conditional include (includeIf): .git/config의 includeIf가 불러오는 설정을 해당 파일로 직접 옮기고, includeIf를 제거한 후 재시도하십시오. 전역 git 구성의 includeIf는 이 오류를 발생시키지 않습니다.
  • Git was not run: the repository's own git config sets <key>: 메시지에는 lfs.customtransfer.<name>.path 또는 lfs.standalonetransferagent처럼 Git LFS가 실행할 프로그램을 가리키는 키가 명시됩니다. 해당 설정이 사용자가 지정한 것이라면 전역 git 구성으로 옮기십시오. 알지 못하는 설정이라면 신뢰할 수 없는 도구나 체크아웃이 기록했을 수 있으므로 저장소의 git 구성에서 제거하십시오. 저장소 구성에서 키가 제거되면 재시도하십시오.

부분 클론에서 워크트리 생성 실패

This repository is a partial clone이 포함된 오류는 Claude Code가 워크트리의 시작 커밋에 필요한 모든 git 객체를 가져올 수 없었음을 의미합니다. 메시지에서 try again으로 끝나는 문장에 안내된 단계를 수행하십시오. 그런 다음 해당 단계를 수행한 셸에서 재시도하십시오. claude --worktree를 실행하거나, 그곳에서 claude를 시작하고 다시 요청하면 됩니다.

Can only use --worktree in a git repository

이 오류는 git 체크아웃이 아닌 디렉터리에서 --worktree를 전달했으며 활성화된 WorktreeCreate 훅이 없음을 의미합니다.
  • 버전 관리가 없는 폴더에서는 그곳에서 git init을 실행하고 첫 커밋을 생성한 후 재시도하십시오.
  • 다른 버전 관리 시스템의 체크아웃에서는 메시지가 제안하는 훅을 설정하십시오.
  • 디렉터리에서 직접 작업하려면 --worktree 없이 Claude를 시작하십시오.

워크트리 디렉터리가 belongs to a different repository로 표시됨

belongs to a different repository 및 is a leftover worktree 오류는 모두 git이 전달한 워크트리 이름의 디렉터리를 다른 위치에 연결하고 있음을 의미합니다. 이는 프로젝트를 복사하거나 이동한 후에 발생할 수 있습니다. 다른 워크트리 이름을 전달하십시오. 디렉터리에 보존할 작업이 없고 프로젝트를 복사하거나 이동하지 않았다면 디렉터리를 제거하고 같은 이름으로 재시도할 수 있습니다. 복사나 이동 후에는 이 재시도가 is already checked out elsewhere in this repository로 실패할 수 있으므로 다른 이름을 사용하십시오.

Claude Code가 워크트리 사용을 거부함

Refusing to use <path> as an isolation worktree로 시작하는 오류는 Claude Code가 해당 디렉터리를 세션 또는 서브에이전트의 격리된 체크아웃으로 채택하기 전에 디렉터리의 git ID를 확인하고 이를 거부했음을 의미합니다. 이 확인은 Claude Code가 워크트리를 생성하든, 기존 워크트리에 진입하든, 이전 실행의 워크트리를 재사용하든 항상 실행됩니다. 대부분의 경우 메시지의 나머지 부분은 디렉터리의 git 메타데이터가 메인 체크아웃으로 확인된다고 알려줍니다. 예를 들어 .git 파일이 메인 저장소 자체의 .git 디렉터리를 가리키거나, git이 core.worktree 리디렉션을 통해 작업 트리를 메인 체크아웃으로 확인하는 경우입니다. 이러한 디렉터리에서는 git reset --hard 같은 일반적인 git 명령이 워크트리가 아닌 메인 체크아웃에 작용합니다. 또한 Claude Code는 디렉터리에 읽을 수 없는 .git 항목이 있는 경우, 워크트리가 안전하다고 가정하지 않고 거부합니다. WorktreeCreate 훅이 생성하는 디렉터리처럼 git 메타데이터가 전혀 없는 디렉터리는 어떤 git 저장소에도 포함되지 않은 경우에만 확���을 통과합니다. 훅이 저장소 안에 디렉터리를 생성하면 git은 이를 해당 저장소의 체크아웃으로 확인하고 Claude Code는 git resolves its working tree to 메시지와 함께 이를 거부하므로, 훅이 모든 저장소 외부에 디렉터리를 생성하도록 하십시오. 거부된 디렉터리에는 작업 내용이 있을 수 있으므로 Claude Code는 이를 그대로 둡니다. 메시지가 Refusing to use <path> 뒤에 오든 재개 메시지에 나타나든, 메시지에 맞는 복구 방법을 찾으십시오. 일부 끝맺음은 재개 메시지에서만 나타납니다.
  • launch from the parent checkout 또는 Run the resume from the project checkout이 포함된 경우: 워크트리 내부에서 Claude Code를 실행했습니다. 대신 메인 체크아웃에서 실행하십시오. 워크트리를 다시 생성할 필요는 없습니다.
  • it cannot be resumed or re-entered가 포함된 경우: 실행한 위치에서 이 세션의 어떤 것도 워크트리를 보증하지 않습니다. 워크트리를 다시 생성하십시오. 디렉터리와 작업 내용은 수동 복구를 위해 디스크에 남아 있으며, 워크트리에 상위 체크아웃이 있는 경우 그곳에서 재개하는 것도 가능합니다.
  • it contains the protected checkout이 포함된 경우: 거부된 디렉터리는 홈 디렉터리처럼 메인 체크아웃의 상위 디렉터리입니다. 이를 삭제하지 마십시오. WorktreeCreate 훅이 반환하는 경로나 EnterWorktree 대상 같은 워크트리 경로를 변경하여 워크트리가 체크아웃을 포함하지 않도록 하십시오.
  • the protected checkout <path> has a .git entry that could not be examined 또는 has git metadata that could not be resolved가 포함된 경우: 문제는 워크트리가 아닌 메인 체크아웃의 git 메타데이터에 있습니다. 워크트리를 삭제하지 말고, 메시지 끝의 워크트리 재생성 안내는 이 두 가지 끝맺음에는 해당하지 않으므로 무시하십시오. 권한 문제나 .git에 대한 git dubious ownership 거부 등 메인 체크아웃을 복구한 후 재시도하십시오. v2.1.302 이전에는 git 2.56 이상에서 the protected checkout 뒤의 <path>에 불필요한 .git 파일이 있을 때도 could not be resolved 끝맺음이 나타났습니다. 여기서 불필요하다는 것은 해당 파일의 gitdir: 줄에 있는 경로가 유효한 git 저장소로 이어지지 않는다는 의미입니다. 복구하려면 Claude Code를 업데이트하고 재시도하십시오. 해당 gitdir: 경로가 더 이상 존재하지 않으면 .git 파일을 삭제하고 재시도할 수도 있습니다.
  • its recorded path has a network spelling이 포함된 경우: Claude Code는 네트워크 경로에 있는 워크트리로는 절대 재개하지 않습니다. 로컬 경로에 워크트리를 다시 생성하십시오.
  • 그 밖의 끝맺음: 메시지에 core.worktree 리디렉션 제거나 워크트리 재생성 등 문제와 해결 방법이 명시되어 있으므로 이를 따르십시오. 메시지에 git ID를 확인할 수 없다고 표시된 디렉터리를 삭제하기 전에, 워크트리 경로의 심볼릭 링크나 git 자체의 실행 실��� 등 명시된 원인을 먼저 해결하십시오. 디렉터리가 정상일 수 있기 때문입니다. 다시 생성하는 경우, 이전 디렉터리는 디스크에 남아 있으므로 필요한 변경 사항을 먼저 복구하십시오.

세션이 워크트리 외부에서 재개됨

세션을 대화형으로 재개할 때 Claude Code가 세션을 워크트리로 되돌릴 수 없으면 아래 메시지 중 하나로 이를 알립니다. Claude Code가 워크트리 바인딩을 해제하면 해제 사실을 세션 트랜스크립트에 기록합니다. 트랜스크립트 쓰기를 억제한 경우에는 대신 바인딩을 해제할 수 없었으며 이후 재개 시 Claude Code가 워크트리를 다시 확인한다는 메시지가 표시됩니다. -p를 사용하는 비대화형 모드와 Agent SDK가 실행하는 재개에서는, Claude Code가 격리 없이 계속하는 대신 사라진 워크트리를 제외한 모든 거부에 대해 stderr 오류와 함께 재개를 중단합니다. --output-format stream-json을 사용하면 거부 내용이 stdout에도 errors 배열에 동일한 텍스트를 담은 하위 유형 error_during_execution의 result 메시지로 전달되므로, Agent SDK 애플리케이션은 0이 아닌 종료 코드만이 아니라 그 이유도 받을 수 있습니다. v2.1.260 이전에는 워크트리 재개 거부 시 result 메시지가 생성되지 않았습니다. 이 메시지들은 표의 대화형 메시지와 형태가 다릅니다.
  • 표에서 Did not re-enter로 표시된 거부의 경우 Error: cannot resume into worktree <path>: ...This session was not started.가 표시됩니다. Claude Code는 종료하기 전에 워크트리 바인딩을 해제하며 오류에 그 사실이 표시됩니다. 다음에 대화를 재개하면 세션은 워크트리 격리 없이 현재 디렉터리에서 계속됩니다. v2.1.260 이전에는 Claude Code가 해제된 바인딩을 기록하지 않았기 때문에 같은 재개를 재시도할 때마다 동일한 오류로 실패했습니다. 트랜스크립트 쓰기를 억제한 경우에는 해제 내용을 저장할 수 없습니다. 이 경우 오류에는 같은 명령이 다시 거부될 것이라는 내용과 함께, 워크트리 없이 계속하는 방법으로 --fork-session과 새 대화 시작이 안내됩니다.
  • Could not verify의 경우 Error: could not verify worktree <path> for this resume, so the resume was aborted...가 표시됩니다.
  • Could not re-enter의 경우 Error: ...The worktree binding is kept.가 표시됩니다.
  • 사라진 워크트리의 경우 Notice: the worktree <path> for this session no longer exists...가 표시됩니다. Claude Code는 이를 출력하고 대화형 재개와 마찬가지로 세션을 계속합니다.
각 오류에 포함된 거부 끝맺음은 대화형 알림과 동일하므로, 여전히 Claude Code가 워크트리 사용을 거부함의 해당 항목과 일치합니다. stream-json 결과에서 startup_failure_reason은 could not verify worktree 오류의 경우 worktree_unverified이고, cannot resume into worktree 및 The worktree binding is kept 오류의 경우 worktree_resume_refused입니다. 애플리케이션은 오류 텍스트를 매칭하는 대신 이 값을 기준으로 분기할 수 있습니다. v2.1.274 이전에는 결과에 startup_failure_reason 필드가 없었습니다.

참고 항목

Worktree는 파일 격리를 처리합니다. 아래의 관련 페이지는 이러한 격리된 체크아웃으로 작업을 위임하고, 그들 간에 발견 사항을 전달하고, 생성한 세션 간에 전환하는 것을 다룹니다: