작업 트리를 사용하면 Codex가 같은 프로젝트에서 여러 채팅을 서로 간섭하지 않고 독립적으로 진행할 수 있습니다. 리포지터리와 작업 트리는 프로젝트가 있는 컴퓨터나 원격 개발 환경에 그대로 있고, 명령어도 그곳에서 실행됩니다. ChatGPT 데스크톱 앱에서 직접 작업하거나, ChatGPT 모바일 앱의 Codex에서 연결된 컴퓨터의 작업 트리 채팅을 시작하고 작업 방향을 안내하거나 작업을 승인하고 검토할 수 있습니다.
Git 리포지터리에서는 예약 작업을 전용 백그라운드 작업 트리에서 실행할 수 있어 진행 중인 작업과 충돌하지 않습니다. 버전 관리를 사용하지 않는 프로젝트에서는 예약 작업이 프로젝트 디렉터리에서 직접 실행됩니다. 작업 트리에서 직접 채팅을 시작하거나 인계 기능으로 채팅을 로컬과 작업 트리 사이에서 옮길 수도 있습니다.
작업 트리는 휴대폰에서 실행되지 않습니다. ChatGPT 모바일 앱은 연결된 컴퓨터나 그 컴퓨터가 사용하는 원격 개발 환경에서 실행되는 Codex를 제어합니다. 리포지터리와 작업 트리도 해당 환경에 그대로 있습니다. 아래의 데스크톱용 안내는 연결된 컴퓨터에서 따라 하세요.
작업 트리란?
Codex의 작업 트리는 내부적으로 Git 작업 트리를 사용하므로 Git 리포지터리에 속한 프로젝트에서만 사용할 수 있습니다. 작업 트리를 만들면 리포지터리의 사본(‘체크아웃’)이 하나 더 생깁니다. 각 작업 트리에는 리포지터리의 모든 파일이 별도로 복사되지만, 커밋과 브랜치 등에 관한 메타데이터(.git 폴더)는 모든 작업 트리가 공유합니다. 따라서 여러 브랜치를 동시에 체크아웃해 병렬로 작업할 수 있습니다.
용어
- 로컬 체크아웃: 사용자가 만든 리포지터리입니다. ChatGPT 데스크톱 앱에서는 간단히 로컬이라고도 합니다.
- 작업 트리: ChatGPT 데스크톱 앱에서 로컬 체크아웃을 바탕으로 만든 Git 작업 트리입니다.
- 인계: 채팅을 로컬과 작업 트리 사이에서 옮기는 플로우입니다. 작업을 안전하게 옮기는 데 필요한 Git 작업은 Codex가 처리합니다.
작업 트리를 사용하는 이유
- 현재 로컬 환경에 영향을 주지 않고 Codex와 병렬로 작업할 수 있습니다.
- 백그라운드 작업을 대기열에 넣어 두고 눈앞의 작업에 집중할 수 있습니다.
- 변경 사항을 직접 살펴보거나 테스트하거나 다른 사람과 협업할 준비가 되면 채팅을 로컬로 옮길 수 있습니다.
시작하기
작업 트리를 사용하려면 Git 리포지터리가 필요합니다. 선택한 프로젝트가 Git 리포지터리에 속해 있는지 확인하세요.
-
‘작업 트리’ 선택
새 채팅 화면에서 Composer 아래의 작업 트리를 선택하세요. 작업 트리의 설정 스크립트를 실행하려면 로컬 환경을 선택하세요.
-
기준 브랜치 선택
Composer 아래에서 작업 트리의 기준이 될 Git 브랜치를 선택하세요.
main또는master브랜치, 기능 브랜치, 아직 스테이징하지 않은 로컬 변경 사항이 있는 현재 브랜치 중에서 선택할 수 있습니다. -
프롬프트 전송
프롬프트를 보내면 Codex가 선택한 브랜치를 기준으로 Git 작업 트리를 만듭니다. 기본적으로 Codex는 분리된 HEAD 상태에서 작업합니다.
-
작업을 계속할 위치 선택
준비가 되면 작업 트리에서 그대로 작업하거나 채팅을 로컬 체크아웃으로 인계하세요. 로컬로 인계하거나 로컬에서 작업 트리로 인계하면 채팅과 코드가 모두 옮겨지므로 다른 체크아웃에서 이어서 작업할 수 있습니다.
로컬과 작업 트리를 오가며 작업하기
작업 트리는 로컬 체크아웃과 화면 구성이나 사용 방식이 비슷합니다. 차이는 작업 과정에서 맡는 역할입니다. 로컬을 포그라운드로, 작업 트리를 백그라운드로 생각하면 됩니다. 인계 기능을 사용하면 두 환경 사이에서 채팅을 옮길 수 있습니다.
인계 기능은 두 체크아웃 사이에서 작업을 안전하게 옮기는 데 필요한 Git 작업을 내부적으로 처리합니다. Git에서는 한 브랜치를 한 번에 한 곳에서만 체크아웃할 수 있습니다. 작업 트리에서 브랜치를 체크아웃한 상태라면 로컬 체크아웃에서 같은 브랜치를 동시에 체크아웃할 수 없습니다. 반대의 경우도 마찬가지입니다.
일반적으로 다음 두 가지 방식으로 작업합니다.
- 작업 트리에서만 작업하기. 로컬 환경 설정 스크립트로 종속성과 도구를 설치한 경우처럼 작업 트리에서 변경 사항을 직접 검증할 수 있을 때 적합합니다.
- 채팅을 로컬로 인계하기. 평소 사용하는 IDE에서 변경 사항을 살펴보고 싶거나 앱 인스턴스를 하나만 실행할 수 있어 채팅을 포그라운드로 가져와야 할 때 사용하세요.
방법 1: 작업 트리에서 작업하기
변경 사항을 작업 트리에 두고 계속 그곳에서만 작업하려면 채팅 헤더의 여기에 브랜치 만들기 버튼을 눌러 현재 작업 트리에 브랜치를 만드세요.
이제 변경 사항을 커밋하고 브랜치를 원격 리포지터리에 푸시한 다음 GitHub에서 pull request를 열 수 있습니다.
헤더의 ‘열기’ 버튼으로 IDE에서 작업 트리를 열거나, 통합 터미널을 사용하거나, 작업 트리 디렉터리에서 필요한 다른 작업을 수행할 수 있습니다.
작업 트리에 브랜치를 만들면 로컬 체크아웃을 포함한 다른 작업 트리에서는 그 브랜치를 동시에 체크아웃할 수 없습니다.
방법 2: 채팅을 로컬로 인계하기
채팅을 포그라운드로 가져오려면 채팅 헤더에서 인계를 선택하고 채팅을 로컬로 옮기세요.
평소 사용하는 IDE 창에서 변경 사항을 살펴보거나 기존 개발 서버를 실행하거나 일상적으로 사용하는 환경에서 작업 결과를 검증할 때 적합한 방법입니다.
작업 트리와 로컬 체크아웃 사이에서 채팅을 안전하게 옮기는 데 필요한 Git 작업은 Codex가 처리합니다.
각 채팅에는 처음 연결된 작업 트리가 계속 할당됩니다. 나중에 채팅을 작업 트리로 다시 인계하면 Codex가 원래의 백그라운드 환경으로 채팅을 옮기므로 중단한 지점부터 이어서 작업할 수 있습니다.
반대 방향으로도 옮길 수 있습니다. 이미 로컬에서 작업 중이고 포그라운드를 다른 작업에 쓰고 싶다면 인계를 선택해 채팅을 작업 트리로 옮기세요. 로컬에서 다른 일에 집중하는 동안 Codex가 백그라운드에서 계속 작업하도록 할 때 유용합니다.
인계 기능은 Git 작업을 사용하므로 .gitignore에서 무시하도록 지정한 파일은 채팅과 함께 옮겨지지 않습니다. 단, Codex가 .worktreeinclude를 사용해 로컬 관리형 작업 트리로 복사하는 파일은 예외입니다.
고급 정보
Codex 관리형 작업 트리
채팅은 기본적으로 Codex 관리형 작업 트리를 사용합니다. 필요할 때 간편하게 사용하고 작업이 끝나면 삭제할 수 있습니다. 일반적으로 Codex 관리형 작업 트리 하나는 채팅 하나에 전용으로 할당됩니다. 나중에 해당 채팅을 작업 트리로 다시 인계하면 Codex가 같은 작업 트리로 돌려보냅니다.
Codex의 작업 트리 관리 방식
Codex는 $CODEX_HOME/worktrees에 작업 트리를 만듭니다. 시작 커밋은 채팅을 시작할 때 선택한 브랜치의 HEAD 커밋입니다. 로컬 변경 사항이 있는 브랜치를 선택하면 Codex가 아직 커밋하지 않은 변경 사항도 작업 트리에 적용합니다. 작업 트리에서는 특정 브랜치를 체크아웃하지 않고 분리된 HEAD 상태로 작업합니다. 따라서 Codex는 불필요한 브랜치를 추가하지 않고도 여러 작업 트리를 만들 수 있습니다.
Git이 무시하는 로컬 파일을 관리형 작업 트리에 복사하기
Codex가 로컬에서 관리하는 작업 트리는 Git 체크아웃에서 시작하므로 Git이 추적하는 파일은 이미 들어 있습니다. 새 작업 트리에 필요한 로컬 설정 파일을 리포지터리에서 무시하도록 설정했다면 리포지터리 루트에 .worktreeinclude 파일을 추가하세요. 이 파일에 복사할 파일의 경로나 .gitignore 형식의 패턴을 적어 두면 Codex가 관리형 작업 트리를 만들 때 해당 파일을 복사합니다.
이 기능은 .env, .env.local, config/secrets.json처럼 Git이 의도적으로 무시하도록 설정한 파일에 사용하세요. Codex는 Git이 무시하는 파일 중 .worktreeinclude의 항목과 일치하는 파일만 복사합니다. Git이 추적하지 않는 다른 로컬 파일은 복사하지 않습니다. Git이 추적하는 파일은 목록에 넣지 마세요.
Codex는 Git이 무시하는 AGENTS.override.md를 로컬 관리형 작업 트리에 자동으로 복사하므로 .worktreeinclude에 따로 넣을 필요가 없습니다.
# .worktreeinclude
.env
.env.local
config/secrets.json
Codex는 복사할 원본이 심볼릭 링크이면 건너뛰며, 새 체크아웃에 이미 있는 파일은 덮어쓰지 않습니다. 이 동작은 ChatGPT 데스크톱 앱이 로컬에서 관리하는 작업 트리에만 적용됩니다. 원격 작업 트리나 명령줄에서 직접 만든 Git 작업 트리에는 적용되지 않습니다.
브랜치 제한 사항
Codex가 작업 트리에서 작업을 마친 뒤 해당 작업 트리에 feature/a 브랜치를 만들기 위해 여기에 브랜치 만들기를 선택했다고 가정해 보세요. 이제 로컬 체크아웃에서 변경 사항을 테스트하려고 그 브랜치를 체크아웃하면 다음 오류가 발생합니다.
fatal: 'feature/a' is already used by worktree at '<WORKTREE_PATH>'
이 오류를 해결하려면 먼저 작업 트리에서 feature/a 대신 다른 브랜치를 체크아웃하세요.
해당 브랜치를 로컬에서 체크아웃할 계획이라면 두 곳에서 같은 브랜치를 동시에 체크아웃하려고 하지 말고 인계 기능으로 채팅을 로컬로 옮기세요.
이 제한이 있는 이유
Git에서는 같은 브랜치를 여러 작업 트리에서 동시에 체크아웃할 수 없습니다. 브랜치는 작업 트리의 ‘현재 체크아웃 상태’를 가리키는 하나의 변경 가능한 참조(refs/heads/<name>)이기 때문입니다.
브랜치를 체크아웃하면 Git은 해당 브랜치의 HEAD를 그 작업 트리에 속한 것으로 취급합니다. git commit, git reset, git rebase, git merge 등의 작업은 명확한 순서에 따라 한 번에 하나씩 해당 참조를 갱신합니다. 여러 작업 트리에서 같은 브랜치를 동시에 체크아웃할 수 있다면 어느 작업 트리의 작업이 브랜치 참조를 갱신하는지 모호해지고 경쟁 상태가 발생할 수 있습니다. 그 결과 커밋이 유실되거나 인덱스가 불일치하거나 충돌을 어떻게 해결해야 하는지 불분명해질 수 있습니다.
Git은 한 브랜치를 한 번에 하나의 작업 트리에서만 체크아웃하도록 제한해 각 브랜치에 기준이 되는 작업 사본이 하나만 존재하도록 보장합니다. 다른 작업 트리에서는 분리된 HEAD 상태나 별도의 브랜치에서 같은 커밋을 안전하게 참조할 수 있습니다.
작업 트리 정리
작업 트리마다 리포지터리 파일, 종속성, 빌드 캐시 등이 따로 있어 디스크 공간을 많이 차지할 수 있습니다. 따라서 ChatGPT 데스크톱 앱은 작업 트리 수를 적정 수준으로 유지하려고 합니다.
기본적으로 Codex는 가장 최근의 Codex 관리형 작업 트리 15개를 유지합니다. 디스크 사용량을 직접 관리하려면 설정에서 이 한도를 변경하거나 자동 삭제를 끌 수 있습니다.
Codex는 아직 필요한 작업 트리가 삭제되지 않도록 다음 경우에는 관리형 작업 트리를 자동으로 삭제하지 않습니다.
- 고정된 채팅이 작업 트리에 연결되어 있는 경우
- 채팅이 아직 진행 중인 경우
이전 버전에서 만든 영구 작업 트리는 계속 사용할 수 있으며 자동 정리 대상에서 제외됩니다. 프로젝트 메뉴에서는 더 이상 영구 작업 트리를 만들 수 없습니다.
Codex 관리형 작업 트리는 다음 경우에 자동으로 삭제됩니다.
- 연결된 채팅을 보관 처리한 경우
- 설정한 한도를 지키기 위해 Codex가 오래된 작업 트리를 삭제해야 하는 경우
Codex는 관리형 작업 트리를 삭제하기 전에 그곳에서 진행한 작업의 스냅샷을 저장합니다. 작업 트리가 삭제된 후 채팅을 열면 작업 트리를 복원하는 옵션이 표시됩니다.
자주 묻는 질문
작업 트리를 만들 위치를 지정할 수 있나요?
네. Codex는 기본적으로 $CODEX_HOME/worktrees 아래에 관리형 작업 트리를 만듭니다. 다른 위치를 지정하려면 설정 > 작업 트리를 열고 작업 트리 루트를 변경하세요.
채팅을 로컬과 작업 트리 사이에서 옮길 수 있나요?
네. 채팅 헤더의 인계 기능으로 로컬 체크아웃과 작업 트리 사이에서 채팅을 옮길 수 있습니다. 환경 간에 채팅을 안전하게 옮기는 데 필요한 Git 작업은 Codex가 처리합니다. 나중에 채팅을 작업 트리로 다시 인계하면 Codex가 처음 연결된 작업 트리로 채팅을 돌려보냅니다.
작업 트리를 삭제하면 채팅은 어떻게 되나요?
작업 트리 디렉터리가 삭제되어도 채팅은 기록에 남아 있을 수 있습니다. Codex는 관리형 작업 트리를 삭제하기 전에 스냅샷을 저장하므로 연결된 채팅을 다시 열면 작업 트리를 복원하는 옵션이 표시됩니다.