작업 트리

ChatGPT 데스크톱 앱의 Codex에서 Git 작업 트리를 사용하여 채팅을 병렬로 실행하세요

작업 트리를 사용하면 Codex가 같은 프로젝트에서 여러 독립적인 채팅을 서로 간섭 없이 실행할 수 있습니다. 저장소, 작업 트리, 명령은 프로젝트가 있는 컴퓨터 또는 원격 개발 환경에 그대로 유지됩니다. ChatGPT 데스크톱 앱에서 직접 작업하거나, ChatGPT 모바일 앱의 Codex를 사용하여 연결된 컴퓨터의 작업 트리 채팅을 시작하고, 지시하고, 승인하고, 검토할 수 있습니다.

Git 저장소에서는 예약된 작업을 전용 백그라운드 작업 트리에서 실행하여 진행 중인 작업과 충돌하지 않도록 할 수 있습니다. 버전 관리가 적용되지 않는 프로젝트에서는 예약된 작업이 프로젝트 디렉터리에서 직접 실행됩니다. 작업 트리에서 채팅을 수동으로 시작하고 Handoff를 사용하여 채팅을 Local과 작업 트리 간에 이동할 수도 있습니다.

작업 트리란?

작업 트리는 내부적으로 Git 작업 트리를 사용하므로 Git 저장소에 속한 프로젝트에서만 작동합니다. 작업 트리를 사용하면 저장소의 두 번째 사본("checkout")을 만들 수 있습니다. 각 작업 트리에는 저장소의 모든 파일이 별도로 복사되지만, 커밋과 브랜치 등에 관한 메타데이터(.git 폴더)는 모두 공유합니다. 따라서 여러 브랜치를 동시에 checkout하고 작업할 수 있습니다.

용어

  • Local checkout: 사용자가 만든 저장소입니다. ChatGPT 데스크톱 앱에서는 간단히 Local 이라고도 합니다.
  • 작업 트리: ChatGPT 데스크톱 앱에서 local checkout으로부터 생성한 Git 작업 트리입니다.
  • Handoff: Local과 작업 트리 간에 채팅을 이동하는 흐름입니다. Codex가 두 환경 사이에서 작업을 안전하게 이동하는 데 필요한 Git 작업을 처리합니다.

작업 트리를 사용하는 이유

  1. 현재 Local 설정을 방해하지 않고 Codex와 병렬로 작업할 수 있습니다.
  2. 포그라운드 작업에 집중하면서 백그라운드 작업을 대기열에 추가할 수 있습니다.
  3. 변경 사항을 검사하거나 테스트하거나 더 직접적으로 협업할 준비가 되면 나중에 채팅을 Local로 옮길 수 있습니다.

시작하기

작업 트리를 사용하려면 Git 저장소가 필요합니다. 선택한 프로젝트가 Git 저장소에 있는지 확인하세요.

  1. "작업 트리" 선택

    새 채팅 보기의 작성기 아래에서 작업 트리 를 선택합니다. 선택적으로 작업 트리의 설정 스크립트를 실행할 로컬 환경을 선택합니다.

  2. 시작 브랜치 선택

    작성기 아래에서 작업 트리의 기반으로 사용할 Git 브랜치를 선택합니다. main / master 브랜치, 기능 브랜치 또는 스테이징되지 않은 로컬 변경 사항이 있는 현재 브랜치를 선택할 수 있습니다.

  3. 프롬프트 제출

    프롬프트를 제출하면 Codex가 선택한 브랜치를 기반으로 Git 작업 트리를 생성합니다. 기본적으로 Codex는 분리된 HEAD 상태에서 작업합니다.

  4. 작업을 계속할 위치 선택

    준비가 되면 작업 트리에서 바로 계속 작업하거나 채팅을 local checkout으로 Handoff할 수 있습니다. Local로 또는 Local에서 Handoff하면 채팅과 코드를 모두 이동하여 다른 checkout에서 계속 작업할 수 있습니다.

Local과 작업 트리 간에 작업하기

작업 트리의 모양과 사용 방식은 local checkout과 매우 비슷합니다. 차이점은 워크플로에서의 역할입니다. Local을 포그라운드, 작업 트리를 백그라운드라고 생각하면 됩니다. Handoff를 사용하면 두 환경 간에 채팅을 이동할 수 있습니다.

내부적으로 Handoff는 두 checkout 사이에서 작업을 안전하게 이동하는 데 필요한 Git 작업을 처리합니다. 이는 Git에서는 브랜치를 한 번에 한 위치에서만 checkout할 수 있기 때문에 중요합니다. 작업 트리에서 브랜치를 checkout하면 local checkout에서는 동시에 해당 브랜치를 checkout할 수 없으며, 그 반대도 마찬가지입니다.

실제로는 다음 두 가지 경로가 일반적입니다.

  1. 작업 트리에서만 작업합니다. 예를 들어 로컬 환경 설정 스크립트를 사용해 종속 요소와 도구를 설치하여 작업 트리에서 변경 사항을 직접 확인할 수 있을 때 가장 적합합니다.
  2. 채팅을 Local로 Handoff합니다. 일반적으로 사용하는 IDE에서 변경 사항을 검사하고 싶거나 앱 인스턴스를 하나만 실행할 수 있는 경우처럼 채팅을 포그라운드로 가져오려면 이 경로를 사용하세요.

옵션 1: 작업 트리에서 작업하기

변경 사항과 함께 작업 트리에서만 계속 작업하려면 채팅 헤더의 Create branch here 버튼을 사용하여 작업 트리를 브랜치로 전환하세요.

그런 다음 변경 사항을 커밋하고 브랜치를 원격 저장소로 push한 후 GitHub에서 pull request를 열 수 있습니다.

헤더의 "Open" 버튼을 사용하여 작업 트리를 IDE에서 열거나, 통합 터미널을 사용하거나, 작업 트리 디렉터리에서 필요한 다른 작업을 수행할 수 있습니다.

브랜치 컨트롤과 작업 트리 세부 정보가 표시된 작업 트리 채팅 화면(라이트 모드)
작업 트리에서 브랜치를 만들면 로컬 체크아웃을 포함한 다른 어떤 작업 트리에서도 해당 브랜치를 체크아웃할 수 없다는 점에 유의하세요.

옵션 2: 채팅을 Local로 Handoff하기

채팅을 포그라운드로 가져오려면 채팅 헤더에서 Hand off 를 선택하고 Local 로 이동하세요.

평소 사용하는 IDE 창에서 변경 사항을 확인하거나, 기존 개발 서버를 실행하거나, 일상적으로 사용하는 동일한 환경에서 작업을 검증하려는 경우에 적합한 경로입니다.

Codex는 작업 트리와 local checkout 사이에서 채팅을 안전하게 이동하는 데 필요한 Git 단계를 처리합니다.

각 채팅은 시간이 지나도 동일한 작업 트리와 연결된 상태를 유지합니다. 나중에 채팅을 다시 작업 트리로 넘기면 Codex는 중단한 지점부터 이어서 작업할 수 있도록 동일한 백그라운드 환경으로 채팅을 되돌립니다.

채팅을 작업 트리에서 Local로 이동하는 Handoff 대화 상자(라이트 모드)
반대 방향으로 이동할 수도 있습니다. 이미 Local에서 작업 중이고 포그라운드를 비우려면 **Hand off** 를 사용하여 채팅을 작업 트리로 이동하세요. 로컬에서 다른 작업으로 다시 주의를 돌리는 동안 Codex가 백그라운드에서 계속 작업하도록 할 때 유용합니다.

Handoff는 Git 작업을 사용하므로 .gitignore 파일의 일부인 파일은 Codex가 .worktreeinclude를 사용하여 로컬 관리형 작업 트리로 복사하지 않는 한 채팅과 함께 이동하지 않습니다.

고급 세부 정보

Codex 관리형 작업 트리

기본적으로 채팅은 Codex 관리형 작업 트리를 사용합니다. 이러한 작업 트리는 가볍고 일회용으로 사용할 수 있도록 설계되었습니다. Codex 관리형 작업 트리는 일반적으로 하나의 채팅 전용이며, 나중에 해당 채팅을 다시 작업 트리로 Handoff하면 Codex가 동일한 작업 트리로 돌려보냅니다.

Codex가 작업 트리를 관리하는 방식

Codex는 $CODEX_HOME/worktrees에 작업 트리를 생성합니다. 시작 커밋은 채팅을 시작할 때 선택한 브랜치의 HEAD 커밋입니다. 로컬 변경 사항이 있는 브랜치를 선택한 경우 Codex는 커밋되지 않은 변경 사항도 작업 트리에 적용합니다. 작업 트리는 브랜치로 체크아웃되지 않으며 detached HEAD 상태입니다. 따라서 Codex는 브랜치를 어지럽히지 않고 여러 작업 트리를 생성할 수 있습니다.

무시된 로컬 파일을 관리형 작업 트리로 복사하기

로컬 Codex 관리형 작업 트리는 Git checkout에서 시작하므로 추적되는 파일은 이미 존재합니다. 저장소에서 새 작업 트리에 필요한 로컬 설정 파일을 무시하고 있다면 저장소 루트에 .worktreeinclude 파일을 추가하고, Codex가 관리형 작업 트리를 생성할 때 복사할 무시된 경로나 .gitignore 스타일 패턴을 나열하세요.

.env, .env.local 또는 config/secrets.json처럼 Git이 의도적으로 무시하는 파일에 사용하세요. Codex는 .worktreeinclude와 일치하는 무시된 파일만 복사하며 Git이 추적하지 않는 다른 로컬 파일은 복사하지 않습니다. 추적되는 파일은 나열하지 마세요.

Codex는 무시된 AGENTS.override.md를 로컬 관리형 작업 트리로 자동 복사하므로 .worktreeinclude에 나열할 필요가 없습니다.

# .worktreeinclude
.env
.env.local
config/secrets.json

Codex는 소스 심볼릭 링크를 건너뛰고 새 checkout에 이미 있는 파일을 덮어쓰지 않습니다. 이 동작은 로컬 ChatGPT 데스크톱 앱 관리형 작업 트리에 적용되며, 원격 작업 트리나 명령줄에서 직접 생성한 Git 작업 트리에는 적용되지 않습니다.

브랜치 제한 사항

Codex가 작업 트리에서 작업을 완료한 후 Create branch here 를 사용하여 해당 위치에 feature/a 브랜치를 생성했다고 가정해 보겠습니다. 이제 local checkout에서 이를 사용하려고 합니다. 브랜치를 checkout하려고 하면 다음 오류가 발생합니다.

fatal: 'feature/a' is already used by worktree at '<WORKTREE_PATH>'

이 문제를 해결하려면 작업 트리에서 feature/a 대신 다른 브랜치를 checkout해야 합니다.

브랜치를 로컬에서 checkout할 계획이라면 두 위치에서 동일한 브랜치를 동시에 checkout하려 하지 말고 Handoff를 사용하여 채팅을 Local로 이동하세요.

이 제한이 존재하는 이유 브랜치는 작업 트리의 “현재 체크아웃된 상태”를 의미하는 변경 가능한 단일 참조(`refs/heads/`)를 나타내므로, Git은 같은 브랜치를 동시에 둘 이상의 작업 트리에서 체크아웃하지 못하게 합니다.

브랜치를 체크아웃하면 Git은 해당 HEAD를 그 작업 트리가 소유한 것으로 취급하며, git commit, git reset, git rebase, git merge 등의 작업이 명확하게 정의된 순서에 따라 직렬로 해당 참조를 갱신할 것으로 기대합니다. 여러 작업 트리에서 같은 브랜치를 동시에 체크아웃하도록 허용하면 어느 작업 트리의 작업이 브랜치 참조를 갱신하는지 모호해지고 경합 상태가 발생하여, 커밋 유실, 인덱스 불일치 또는 불명확한 충돌 해결로 이어질 수 있습니다.

Git은 각 브랜치를 하나의 작업 트리에서만 체크아웃하도록 제한하여, 각 브랜치에 기준이 되는 작업 사본이 하나만 존재하도록 보장합니다. 동시에 다른 작업 트리에서는 분리된 HEAD 상태나 별도의 브랜치에서 동일한 커밋을 안전하게 참조할 수 있습니다.

작업 트리 정리

작업 트리는 디스크 공간을 많이 차지할 수 있습니다. 각각에 고유한 저장소 파일, 종속 요소, 빌드 캐시 등이 있기 때문입니다. 따라서 ChatGPT 데스크톱 앱은 작업 트리 수를 적절한 한도 내로 유지하려고 합니다.

기본적으로 Codex는 가장 최근의 Codex 관리형 작업 트리 15개를 유지합니다. 디스크 사용량을 직접 관리하려면 설정에서 이 한도를 변경하거나 자동 삭제를 끌 수 있습니다.

Codex는 여전히 중요한 작업 트리를 삭제하지 않으려고 합니다. 다음의 경우 Codex 관리형 작업 트리는 자동으로 삭제되지 않습니다.

  • 고정된 채팅이 해당 작업 트리에 연결되어 있는 경우
  • 채팅이 아직 진행 중인 경우

이전 버전에서 생성한 영구 작업 트리는 계속 사용할 수 있으며 자동 정리 대상에서 제외됩니다. 이제 프로젝트 메뉴에서 영구 작업 트리를 새로 생성할 수는 없습니다.

다음의 경우 Codex 관리형 작업 트리가 자동으로 삭제됩니다.

  • 연결된 채팅을 보관 처리함
  • 구성된 한도를 유지하기 위해 Codex가 오래된 작업 트리를 삭제해야 함

Codex는 관리형 작업 트리를 삭제하기 전에 해당 작업 트리의 작업 스냅샷을 저장합니다. 작업 트리가 삭제된 후 채팅을 열면 이를 복원하는 옵션이 표시됩니다.

자주 묻는 질문

작업 트리가 생성되는 위치를 제어할 수 있나요? 예. Codex는 기본적으로 `$CODEX_HOME/worktrees` 아래에 관리형 작업 트리를 생성합니다. 다른 위치를 선택하려면 **설정 > 작업 트리** 를 열고 **작업 트리 루트** 를 변경하세요.

Local과 작업 트리 간에 채팅을 이동할 수 있나요? 예. 채팅 헤더의 **Hand off** 를 사용하여 로컬 체크아웃과 작업 트리 간에 채팅을 이동할 수 있습니다. Codex는 환경 간에 채팅을 안전하게 이동하는 데 필요한 Git 작업을 처리합니다. 나중에 채팅을 다시 작업 트리로 넘기면 Codex는 해당 채팅을 이전에 연결된 동일한 작업 트리로 되돌립니다.

작업 트리를 삭제하면 채팅은 어떻게 되나요? 연결된 작업 트리 디렉터리가 삭제되어도 채팅은 기록에 남을 수 있습니다. Codex 관리형 작업 트리의 경우 Codex는 작업 트리를 삭제하기 전에 스냅샷을 저장하고, 연결된 채팅을 다시 열면 복원을 제안합니다.