Codex 대화를 포크하는 방법들
/fork로 현재 진행 중인 대화 포크하기
Codex CLI에서 /fork를 입력하고 Enter를 누릅니다. 슬래시 명령어 문서에 설명된 단계는 다음과 같습니다. "Codex가 체크아웃 선택지를 제공하면, 현재 디렉터리 또는 새 worktree를 선택하세요." 문서의 표현을 빌리자면 그 결과는 다음과 같습니다. "Codex는 현재 대화를 새로운 ID를 가진 새 대화로 복제하며, 기존 대화 기록은 그대로 유지하므로 대안적인 방식을 병렬로 탐색할 수 있습니다."
새로운 ID가 부여된다는 점은 나중에 중요해집니다. 이제 기존 대화와 포크된 대화는 서로 다른 두 개의 저장된 대화가 되며, 이 시점부터 각각 독립된 기록을 갖게 됩니다.
터미널에서 codex fork로 저장된 대화 포크하기
현재 참여하고 있지 않은 대화를 포크하려면 터미널에서 codex fork를 실행하세요. 명령줄 참조 문서에 따르면 "기본적으로 codex fork는 세션 선택기(session picker)를 엽니다. 대신 가장 최근 세션을 포크하려면 --last를 추가하세요." 세션 ID를 직접 전달할 수도 있습니다.
대화가 저장된 디렉터리와 현재 디렉터리가 다른 경우, Codex는 어디에서 작업할지 묻습니다. 참조 문서에 따르면 "현재 디렉터리와 저장된 세션 디렉터리가 다를 때, codex fork는 codex resume과 동일한 작업 디렉터리 프롬프트 및 tui.resume_cwd 설정을 사용합니다."
이전 메시지에서 포크하기
분기점이 현재 시점이 아닐 때도 있습니다. Codex가 피하고 싶은 경로로 들어서기 전인 세 메시지 전일 수 있습니다. CLI 참조 문서에는 다음과 같은 단축키가 설명되어 있습니다. "입력창이 비어 있는 상태에서 Escape를 두 번 누르면 이전 사용자 메시지를 편집하고 그 시점부터 대화를 포크할 수 있습니다."
Codex의 '새로운 기능(What's new)' 페이지에 따르면, 2월에 앱에 포크 기능이 추가되었으며("앱에 대화 포크 기능도 추가되었습니다"), 3월 항목에는 다음과 같이 기록되어 있습니다. "이전 메시지에서 대화를 포크할 수 있게 되어, 기존 경로를 잃지 않고 새로운 방식을 더 쉽게 시도해 볼 수 있습니다."
/side로 사이드 질문하기
모든 우회로에 전체 포크가 필요한 것은 아닙니다. 슬래시 명령어 문서에서는 /side를 "메인 대화에서 벗어나지 않고 현재 대화로부터 임시(ephemeral) 포크를 시작하는 방법"으로 설명합니다. 사이드 대화의 기록은 "상위 대화와 분리"되며, 사이드 대화에 머무는 동안에도 TUI는 상위 대화의 상태를 계속 표시합니다.
계획에 대한 빠른 질문, 위험 요소 확인, 또는 메인 대화를 어지럽히고 싶지 않은 설명 요구 등에 이 기능을 사용하세요. 문서에 따르면 "/side는 다른 사이드 대화 내부 및 리뷰 모드 중에는 사용할 수 없습니다."
대화형 세션을 시작하지 않고 포크하기
스크립트 작업의 경우, codex exec fork를 사용하여 저장된 세션을 새 세션으로 복사할 수 있습니다. 참조 문서에 따르면 "프롬프트가 없으면 Codex는 턴을 시작하지 않고 포크를 생성합니다." 프롬프트를 추가하면 포크가 즉시 해당 작업을 시작합니다.
포크에 포함되는 것과 제외되는 것
대화 내용은 그대로 복사됩니다
포크는 포크 시점까지의 전체 대화 기록을 가지고 시작합니다. 작업 내용, 관련 파일, 이미 내린 결정 사항들을 다시 설명할 필요가 없습니다. 이것이 새 대화를 시작하는 대신 포크를 사용하는 가장 큰 이유입니다.
파일은 선택한 체크아웃 방식에 따라 달라집니다
이 부분은 미리 계획해야 합니다. 포크는 대화를 복사하는 것이지 작업 디렉터리를 복사하는 것이 아닙니다. 현재 디렉터리로 포크하면 기존 대화와 포크된 대화가 동일한 파일을 대상으로 작업하게 됩니다. 포크된 대화가 변경한 내용은 기존 대화의 디스크에서도 그대로 보이며, 그 반대도 마찬가지입니다.
코드를 수정하는 실험을 하려면 worktree로 포크하세요. CLI에서는 codex fork <SESSION_ID> --worktree 명령으로 이를 수행할 수 있으며, 참조 문서에 따르면 이 명령은 "명시적인 세션 ID와 로컬 실행이 필요하며, --last나 세션 선택기는 지원하지 않습니다." /fork를 사용할 때는 Codex가 체크아웃 선택지를 제공할 때 새 worktree를 선택하세요.
worktrees 문서는 다음과 같이 설명합니다. "각 worktree는 리포지토리의 모든 파일에 대한 자체 복사본을 갖지만, 커밋, 브랜치 등에 대한 동일한 메타데이터(.git 폴더)를 공유합니다." 데스크톱 앱이 관리하는 worktree의 경우, "시작 커밋은 대화를 시작할 때 선택한 브랜치의 HEAD 커밋입니다." 그리고 "로컬 변경 사항이 있는 브랜치를 선택한 경우, Codex는 커밋되지 않은 변경 사항도 worktree에 적용합니다."
Git이 무시(ignore)하는 파일은 예외입니다. 문서에 따르면 "Codex는 .worktreeinclude와 일치하는 무시된 파일만 복사하며, Git이 추적하지 않는 다른 로컬 파일은 복사하지 않습니다." 프로젝트 실행에 .env 파일이 필요하다면 .worktreeinclude에 등록해야 합니다. 그렇지 않으면 실험이 기존 환경처럼 시작되지 않을 수 있습니다. 단, 한 가지 예외는 자동으로 처리됩니다. "Codex는 무시된 AGENTS.override.md 파일을 로컬 관리형 worktree로 자동으로 복사합니다." 문서에서는 이 동작이 "로컬 ChatGPT 데스크톱 앱이 관리하는 worktree에 적용되며, 원격 worktree나 명령줄에서 직접 생성한 Git worktree에는 적용되지 않는다"고 덧붙입니다.
지침은 대화가 아닌 리포지토리에서 가져옵니다
AGENTS.md는 대화의 일부가 아닙니다. 이는 리포지토리에 있는 파일이므로, 포크된 대화도 기존 대화가 읽었던 것과 동일하게 추적된 AGENTS.md를 읽습니다. 만약 worktree로 포크하여 거기서 AGENTS.md를 수정한다면, 기존 대화는 자체 체크아웃에 도달하기 전까지는 그 변경 사항을 알지 못합니다. Codex가 이러한 파일들을 찾고 결합하는 방법은 Our guide to why Codex skips AGENTS.md rules에서 다룹니다.
기억(Memories)은 기기별로 저장되며, 대화별 스위치가 제공됩니다
Codex의 로컬 기억(memories)은 기본적으로 ~/.codex/memories/ 아래의 Codex 홈 디렉터리에 저장됩니다. 이 기억들은 해당 기기의 모든 대화에서 공유되므로, 포크된 대화도 기존 대화와 동일한 저장소를 활용합니다. 대화별로 설정할 수 있는 것은 해당 대화가 기억을 사용하고 기여할지 여부입니다. 기억 관련 문서에 따르면 "현재 대화의 기억 동작을 제어하려면 /memories를 사용하세요"라고 되어 있으며, "대화 수준의 선택은 전역 기억 설정을 변경하지 않습니다."
문서에는 포크가 기존 대화의 /memories 설정을 그대로 유지하는지 명시되어 있지 않으므로, 중요할 경우 포크된 대화에서 직접 확인해 보세요. 일부러 좋지 않은 아이디어를 테스트하기 위해 포크하는 경우라면, 해당 대화가 향후 기억에 반영되는 것을 원치 않을 수 있습니다. 기억이 생성되고 재설정되는 방식은 Our guide to Codex local memories에서 다룹니다.
포크에서 발견한 결과는 포크에만 머뭅니다
포크 관련 문서에는 대화를 새 대화로 복사하는 방법만 설명되어 있습니다. 포크된 대화를 다시 기존 대화로 병합하는 방법은 설명되어 있지 않습니다. 포크에서 발견한 모든 내용은 포크된 대화 기록에만 남습니다. 실험이 성공하더라도 사용자가 직접 알려주지 않는 한 기존 대화는 이를 알 수 없습니다.
공유된 스냅샷은 포크할 수 없습니다
누군가 공유해 준 Codex 대화는 읽을 수는 있지만, 그들이 멈춘 지점부터 이어서 진행할 수는 없습니다. 문서에 따르면 "공유된 스냅샷에서는 원본 스레드를 포크할 수 없습니다. 스냅샷을 첨부 파일로 가져와 새 스레드에서 참조할 수는 있습니다." 또한 공유된 스냅샷에는 많은 정보가 누락됩니다. "원본 스레드의 도구 호출(tool calls), 셸 명령, 도구 입력 또는 출력은 포함되지 않습니다."
포크를 실패하게 만드는 잘못된 가정들
포크가 자체 파일을 가지고 있다고 가정하는 것. 포크는 자체 대화 기록을 가질 뿐입니다. 파일은 선택한 체크아웃 방식에 따릅니다. 현재 디렉터리에서 작업할 경우 두 대화 모두 동일한 코드를 수정하게 됩니다.
기존 대화가 포크에서 발견한 내용을 자동으로 학습할 것이라 가정하는 것. 두 대화 기록은 포크 시점부터 완전히 분리됩니다.
worktree에 프로젝트에 필요한 모든 것이 들어있다고 가정하는 것. 추적 대상 파일은 포함되지만, 무시된 파일은 .worktreeinclude와 일치하는 경우에만 포함됩니다.
단순히 질문만 하려는데 포크를 사용하는 것. 일회성 확인을 위해 전체 포크를 하면 관리해야 할 저장된 대화만 하나 더 늘어납니다. 이런 용도로는 /side가 적합합니다.
작업이 실제로 분기되지 않았는데 포크하는 것. Codex의 권장 사항은 명확합니다. "일관된 작업 단위당 하나의 대화를 유지하세요. 작업이 여전히 동일한 문제의 일부라면, 추론 과정을 보존할 수 있도록 동일한 대화에 머무는 것이 더 좋습니다. 작업이 진정으로 분기될 때만 포크하세요."
해결책: 작업 분기 여부 결정, 올바른 체크아웃으로 포크, 그리고 결과를 다시 가져오기
1단계: 포크, 사이드 대화 중 무엇이 필요한지(혹은 둘 다 필요 없는지) 결정하기
지금 하려는 작업이 무엇인지 자문해 보세요. 현재 작업에 대한 빠른 질문이라면 /side를 사용하세요. 다른 코드를 생성하게 될 완전히 다른 방식의 접근이라면 포크를 하세요. 동일한 문제의 다음 단계라면 현재 대화에 머무르세요.
분기점이 이미 지나간 시점이라면 CLI에서 Escape 단축키를 사용하여 되돌리고 싶은 턴 이전부터 포크를 시작하세요.
2단계: 두 대화 모두 파일을 수정할 때는 worktree로 포크하기
실험 과정에서 코드를 수정할 예정이고 기존 대화의 파일들을 그대로 유지하고 싶다면 worktree로 포크하세요. 이를 본격적으로 사용하기 전에, 프로젝트 실행에 필요한 파일들이 worktree에 있는지 확인하세요. 무시된 설정 파일들을 .worktreeinclude에 한 번 등록해 두면 모든 관리형 worktree에 자동으로 포함됩니다.
아무것도 수정하지 않고 계획만 비교하기 위해 포크하는 것이라면 현재 디렉터리로 포크해도 괜찮습니다.
그런 다음 두 대화를 구분할 수 있도록 이름을 지정하세요. 문서에 따르면 /rename 명령어는 "대화 기록을 변경하지 않고 저장된 대화 이름을 업데이트합니다." 기존 대화에는 현재 취하고 있는 접근 방식의 이름을, 포크된 대화에는 대안 방식의 이름을 붙이세요. 데스크톱 앱에서는 계속 진행할 대화를 고정(pin)해 두는 것이 좋습니다.
3단계: 포크에서 결정된 사항을 기록하고 다시 가져오기
실험이 끝나면 어떤 대화를 계속 이어갈지 결정하세요. 포크의 접근 방식이 채택되었다면 포크된 대화에서 계속 진행하거나, 변경 사항, 성공한 이유, 제외된 대안 등을 기존 대화로 직접 가져오세요.
이 결정이 향후 대화에도 적용되어야 한다면 AGENTS.md나 프로젝트 문서에 기록해 두세요. Codex의 기억 관련 문서에서는 그 이유를 다음과 같이 설명합니다. "필수적인 팀 지침은 AGENTS.md나 체크인된 문서에 보관하세요. 기억은 유용한 보조 회상 레이어로 취급해야 하며, 항상 적용되어야 하는 규칙의 유일한 원천으로 삼아서는 안 됩니다."
결과를 다른 사람과 공유하고 싶다면, 공유된 스냅샷은 읽고 첨부할 수는 있지만 포크할 수는 없다는 점을 기억하세요. 링크와 함께 결론을 직접 설명해 주는 것이 좋습니다.
MemoryLake에서 설정하기
포크를 사용하면 대화가 늘어납니다. 몇 번의 실험을 거치고 나면, 결정의 배경이 되는 추론 과정이 기존 대화, 두 개의 포크, 그리고 하나의 사이드 대화에 흩어지게 되며, 이들은 서로의 존재를 알지 못합니다.
MemoryLake는 결론들을 사용자가 직접 관리하는 하나의 리스트로 유지해 주는 기억 레이어입니다. 이를 통해 대화의 출처와 관계없이 Codex 및 연결된 다른 어시스턴트(ChatGPT, Claude Code 등)에서 해당 결론을 활용할 수 있습니다.
항목은 사용자가 직접 자신의 언어로 작성합니다. 사용자의 Codex 대화, worktrees, ~/.codex 디렉터리나 그 기억, AGENTS.md 파일, 또는 기타 벤더의 저장소에서 데이터를 읽거나 쓰거나 삭제하지 않습니다. 비밀번호나 자격 증명 정보는 제외하고, 프로젝트 세부 정보에 대해서는 소속 조직의 정책을 따르세요.
1단계: API 키 생성하기
로그인 후 대시보드에서 키를 생성합니다. 이 키는 사용자의 MemoryLake 워크스페이스에 속하며, ChatGPT 계정과는 별개입니다.

2단계: 첫 번째 기억 업로드하기
최근에 진행한 몇 개의 포크부터 시작해 보세요. 각 포크에 대해 어떤 접근 방식이 채택되었는지, 그 이유는 무엇인지, 그리고 탈락한 방식에서 무엇을 배웠는지 작성합니다. 항목당 하나의 결정을 날짜 및 적용되는 리포지토리 정보와 함께 기록합니다.

3단계: AI 및 에이전트 연결하기
Codex 및 사용 중인 다른 어시스턴트들을 연결하세요. 포크된 대화든 완전히 새로운 대화든, 다음 대화는 이미 결정된 사항들을 바탕으로 시작할 수 있습니다.

실제 작업에서 달라지는 점
첫 번째 변화는 실험이 더 이상 기존 코드를 위험에 빠뜨리지 않는다는 점입니다. worktree를 사용하면 포크된 대화가 자체 파일을 가지므로 기존 대화의 코드는 그대로 유지됩니다.
두 번째는 대화들을 명확히 구분할 수 있다는 점입니다. 대화에 이름을 지정하고, 언제 포크를 하고 언제 /side를 사용할지에 대한 명확한 규칙을 세우면 세션 목록을 깔끔하게 유지할 수 있습니다.
세 번째는 결과가 포크된 대화에만 고립되지 않는다는 점입니다. 결론을 기존 대화, AGENTS.md, 또는 직접 관리하는 리스트에 기록해 두면 다음 대화에서도 내가 발견한 내용을 알 수 있습니다. 나중에 오래된 대화나 포크를 찾아야 하는 경우, Codex가 대화 기록을 보관하는 위치를 다룬 our guide to finding missing Codex chat history를 참고하세요. 새 대화가 프로젝트를 기억하지 못하는 이유에 대해서는 our guide to why Codex forgets project context를 참고하시기 바랍니다.
Codex 대화 포크 모범 사례
작업이 실제로 분기될 때만 포크하세요. 동일한 문제의 다음 단계라면 동일한 대화에 머무르세요.
질문에는 /side를 사용하세요. 전체 포크를 생성하지 않고도 메인 대화 기록을 어지럽히지 않고 우회할 수 있습니다.
코드 변경이 있을 때는 worktree로 포크하세요. 그렇지 않으면 두 대화가 동일한 파일을 수정하게 됩니다.
.worktreeinclude를 한 번 설정해 두세요. 그렇지 않으면 .env와 같이 프로젝트에 필요한 무시된 파일들이 새 worktree에 포함되지 않습니다.
두 대화 모두에 이름을 지정하세요. /rename을 사용하여 선택기에서 어떤 대화가 어떤 접근 방식인지 쉽게 확인할 수 있도록 하세요.
포크된 대화에서 /memories 설정을 확인하세요. 실험 내용이 향후 기억에 반영되어야 할지 결정하세요.
결과를 다시 가져오세요. 계속 진행할 대화에 결정을 기록하거나, 영구적으로 적용해야 한다면 AGENTS.md에 기록하세요.
Conclusion
Codex 대화를 포크하면 대화 내용이 새로운 ID를 가진 새 대화로 복사되고 기존 대화는 그대로 유지됩니다. 현재 대화는 /fork로, 저장된 대화는 codex fork로, 이전 시점은 Escape 단축키로 포크할 수 있으며, /side로 사이드 질문을 던질 수도 있습니다. 다만, worktree를 선택하지 않으면 별도의 파일이 제공되지 않으며, 발견한 결과를 자동으로 병합해 주지 않고, 공유된 스냅샷에서는 포크를 진행할 수 없다는 점을 유의해야 합니다.
작업이 실제로 분기되는지 판단하고, 두 대화 모두 파일을 수정할 때는 worktree로 포크하며, 두 대화의 이름을 지정하고, 작업이 끝나면 결과를 다시 가져오세요. 그렇게 하면 실험이 기존 대화를 대체하는 대신 기존 대화에 도움을 주는 방식으로 작용할 것입니다.