MemoryLake
すべての記事に戻る
Tutorial2026年10月20日·12 分で読了

元の会話を失わずにCodexチャットをフォークする方法(2026年版ガイド)

Codexとのチャットの途中で、別のアプローチを試したくなることがあります。Codexが提案した計画がリスクが高そうに見えたり、最初のアプローチにコミットする前に別のライブラリでどうなるかを確認したくなったりした場合です。これまでの会話を捨てたくはありませんし、実験内容を元の会話に混ぜたくもありません。

そのような場合に役立つのがフォーク(forking)です。Codexのドキュメントでは、/forkを「現在のトランスクリプトを失うことなく、アクティブなセッションを分岐させて新しいアプローチを探索する」方法として説明しています。これにより、チャットが新しいチャットにコピーされ、元のチャットはそのまま残ります。

ただし、フォークには単一のコマンド以上のオプションがあり、コピーの挙動には知っておくべき注意点があります。フォークは会話をコピーします。独自のファイルも取得するかどうかは、選択するチェックアウト(checkout)によって異なります。ドキュメントには、フォークしたチャットを元のチャットにマージして戻す方法については記載されていません。また、共有されたチャットのスナップショットはフォークできません。

このガイドでは、Codexでチャットをフォークする各方法、フォークに引き継がれるものと残されるもの、そして元のチャットとフォークしたチャットが混乱しないようにする方法について解説します。他のツールにおける同様のコンセプトについては、ChatGPTの「新しいチャットで分岐」をカバーしたChatGPTの会話を分岐させるガイドや、Claude CodeをカバーしたClaude Codeセッションのフォークに関する解説をご覧ください。本記事はCodexに特化した内容です。

Codexチャットをフォークする方法

/fork で現在のチャットをフォークする

Codex CLIで /fork と入力してEnterキーを押します。スラッシュコマンドのドキュメントには、次の手順が記載されています。「Codexがチェックアウトの選択肢を提示した場合は、現在のディレクトリまたは新しいworktreeを選択します。」その結果、ドキュメントの言葉を借りれば、「Codexは現在のチャットを新しいIDを持つ新しいチャットにクローンし、元のトランスクリプトはそのまま残すため、並行して別のアプローチを探索できます。」

この「新しいID」は後で重要になります。元のチャットとフォークされたチャットは、この時点からそれぞれ独自の履歴を持つ2つの独立した保存済みチャットになります。

ターミナルから codex fork で保存済みのチャットをフォークする

現在開いていないチャットをフォークするには、ターミナルから codex fork を実行します。コマンドラインリファレンスには、「デフォルトでは、codex fork はセッションピッカーを開きます。代わりに --last を追加すると、最新のセッションをフォークします」と記載されています。セッションIDを直接渡すことも可能です。

チャットが保存されたディレクトリとは異なるディレクトリにいる場合、Codexはどこで作業するかを尋ねます。リファレンスには、「現在と保存されたセッションのディレクトリが異なる場合、codex fork は codex resume と同じ作業ディレクトリのプロンプトおよび tui.resume_cwd 設定を使用します」とあります。

過去のメッセージからフォークする

分岐点が「現在」ではないこともあります。Codexが回避したい方向に進む前の、3つ前のメッセージである場合などです。CLIリファレンスには、ショートカットが記載されています。「コンポーザーが空の状態でEscapeキーを2回押すと、前のユーザーメッセージを編集し、その時点からチャットをフォークできます。」

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を選択します。

worktreeのドキュメントでは、得られるものについて次のように説明されています。「各worktreeにはリポジトリ内のすべてのファイルの独自のコピーがありますが、コミットやブランチなどに関する同じメタデータ(.git フォルダ)をすべて共有します。」デスクトップアプリが管理するworktreeの場合、「開始コミットは、チャットを開始したときに選択されたブランチの HEAD コミット」であり、「ローカルの変更があるブランチを選択した場合、Codexは未コミットの変更もworktreeに適用します。」

Gitが無視(ignore)するファイルは扱いが異なります。ドキュメントには、「Codexは .worktreeinclude に一致する無視されたファイルのみをコピーし、Gitが追跡していない他のローカルファイルはコピーしません」とあります。プロジェクトの実行に .env ファイルが必要な場合は、それを .worktreeinclude にリストしておかないと、実験が元のチャットと同じように開始できない可能性があります。ただし、1つの例外は自動的に処理されます。「Codexは無視された AGENTS.override.md をローカルの管理対象worktreeに自動的にコピーします。」ドキュメントは、この挙動が「ローカルのChatGPTデスクトップアプリが管理するworktreeに適用され、リモートのworktreeやコマンドラインから自分で作成したGitのworktreeには適用されません」と付け加えています。

指示はチャットではなくリポジトリから取得される

AGENTS.md は会話の一部ではありません。リポジトリ内のファイルであるため、フォークされたチャットは元のチャットと同じ追跡対象の AGENTS.md を読み込みます。worktreeにフォークしてそこで AGENTS.md を編集した場合、元のチャットが独自のチェックアウトに達するまで、その変更は元のチャットには表示されません。CodexがAGENTS.mdのルールをスキップする理由に関するガイドでは、Codexがこれらのファイルをどのように見つけて結合するかを解説しています。

メモリはマシンごと、チャットごとのスイッチ付き

Codexのローカルメモリは、デフォルトで ~/.codex/memories/ の下にあるCodexのホームディレクトリに保存されます。これらはそのマシン上のすべてのチャットで共有されるため、フォークされたチャットも元のチャットと同じストアを利用します。チャットごとに設定できるのは、そのチャットがメモリを使用し、メモリに貢献するかどうかです。メモリのドキュメントには、「現在のチャットのメモリの挙動を制御するには /memories を使用します」および「チャットレベルの選択は、グローバルなメモリ設定を変更しません」と記載されています。

ドキュメントには、フォークが元のチャットの /memories の選択を引き継ぐかどうかは明記されていないため、重要である場合はフォーク先で確認してください。あえて良くないアイデアを試すためにフォークする場合、そのチャットが将来のメモリに反映されるのを避けたいかもしれません。Codexローカルメモリに関するガイドでは、メモリがどのように生成され、リセットされるかを解説しています。

フォークでの発見はフォーク内に留まる

フォークのドキュメントでは、チャットを新しいチャットにコピーすることについて説明しています。フォークした会話を元のチャットにマージして戻す方法については説明されていません。フォークで発見されたことは、すべてフォークのトランスクリプト内に留まります。実験がうまくいったとしても、あなたが伝えない限り、元のチャットはそのことを知りません。

共有されたスナップショットはフォークできない

誰かが共有したCodexチャットを送ってきた場合、それを読むことはできますが、相手が中断したところから再開することはできません。ドキュメントには次のように記載されています。「共有されたスナップショットから元のスレッドをフォークすることはできません。スナップショットを添付ファイルとしてインポートし、新しいスレッドで参照することは可能です。」また、共有されたスナップショットには多くの情報が欠落しています。「元のスレッドのツール呼び出し、シェルコマンド、ツールの入力や出力は含まれません。」

フォークが失敗する原因となる思い込み

フォークが独自のファイルを持っていると思い込むこと。 フォークが持っているのは独自の会話履歴です。ファイルは、選択したチェックアウトに依存します。現在のディレクトリにいる場合、両方のチャットが同じコードを編集します。

フォークでの発見を元のチャットが自動的に学習すると思い込むこと。 2つのトランスクリプトは、フォークした時点から完全に分離されています。

worktreeにプロジェクトに必要なものがすべて揃っていると思い込むこと。 追跡対象のファイルは揃っていますが、無視されたファイルは .worktreeinclude に一致するもののみです。

単に質問したいだけなのにフォークしてしまうこと。 単発の確認のために完全なフォークを行うと、管理すべき不要な保存済みチャットが増えてしまいます。そのような場合は /side を使用するように設計されています。

作業が実際には分岐していないのにフォークしてしまうこと。 Codexのベストプラクティスは明確です。「一貫した作業単位ごとに1つのチャットを維持してください。作業が依然として同じ問題の一部である場合は、推論のプロセスが保存されるため、同じチャットに留まる方が良い場合が多いです。作業が本当に分岐する場合にのみフォークしてください。」

解決策:作業が分岐するかどうかを判断し、適切なチェックアウトにフォークし、結果を持ち帰る

ステップ1:フォーク、サイドチャット、またはそのどちらも不要かを判断する

これから行おうとしている作業について考えてみてください。現在の作業に関する簡単な質問であれば、/side を使用します。異なるコードを生成する、本質的に異なるアプローチであれば、フォークします。同じ問題の次のステップであれば、現在のチャットに留まります。

分岐点が過去にある場合は、CLIでEscapeショートカットを使用し、取り消したいターンの前からフォークを開始します。

ステップ2:両方のチャットがファイルを操作する場合はworktreeにフォークする

実験でコードを編集し、元のチャットのファイルをそのまま残したい場合は、worktreeにフォークします。実際に使用する前に、プロジェクトの実行に必要なものがworktreeに揃っているか確認してください。無視されたセットアップファイルを .worktreeinclude に一度追加しておけば、すべての管理対象worktreeにそれらが適用されます。

何も編集せずに計画を比較するためにフォークするだけであれば、現在のディレクトリにフォークしても問題ありません。

次に、区別できるように両方のチャットに名前を付けます。ドキュメントによると、/rename コマンドは「トランスクリプトを変更せずに、保存されたチャット名を更新します」。元のチャットには採用しているアプローチの名前を、フォークには代替案の名前を付けます。デスクトップアプリでは、継続する方をピン留めしておきます。

ステップ3:フォークで決定した内容を記録し、持ち帰る

実験が終了したら、どちらのチャットを継続するかを決定します。フォークのアプローチが採用された場合は、そのままフォークで作業を続けるか、変更内容、それが機能した理由、および除外した選択肢などの結果を自分で元のチャットに持ち帰ります。

その決定を将来のチャットにも適用する必要がある場合は、AGENTS.md またはプロジェクトのドキュメントに記載してください。Codexのメモリに関するドキュメントには、その理由が記載されています。「必要なチームのガイダンスは AGENTS.md またはチェックインされたドキュメントに保管してください。メモリは、常に適用されるべきルールの唯一の情報源としてではなく、役立つ想起レイヤーとして扱ってください。」

結果を誰かと共有したい場合、共有されたスナップショットは閲覧や添付はできますが、フォークはできないことを覚えておいてください。リンクと一緒に結論を伝えてあげましょう。

MemoryLakeでの設定方法

フォークを行うと会話が増えていきます。いくつかの実験を行うと、決定の背後にある推論が、元のチャット、2つのフォーク、そしてサイドチャットに分散してしまい、それぞれが他のチャットの存在を知らない状態になります。

MemoryLakeは、結論を1つのリストにまとめて維持するためのメモリレイヤーです。これにより、どのチャットから得られた結論であっても、接続しているCodexや、ChatGPT、Claude Codeなどの他のアシスタントから利用できるようになります。

エントリーは、あなた自身の言葉で自分で作成します。Codexのチャット、worktree、~/.codex ディレクトリやそのメモリ、AGENTS.md ファイル、またはベンダーのストアから何かが読み取られたり、書き込まれたり、削除されたりすることはありません。機密情報や認証情報は除外し、プロジェクトの詳細については組織のポリシーに従ってください。

ステップ1:APIキーを作成する

サインインし、ダッシュボードからキーを生成します。このキーはMemoryLakeのワークスペースに属しており、ChatGPTのアカウントとは異なります。

エージェントで使用するために新しいキーが作成され、コピーされるAPIキー画面が表示されているMemoryLakeコンソール
エージェントで使用するために新しいキーが作成され、コピーされるAPIキー画面が表示されているMemoryLakeコンソール

ステップ2:最初のメモリをアップロードする

直近のいくつかのフォークから始めましょう。それぞれについて、どのアプローチが採用されたか、その理由、そして不採用となったアプローチから何を学んだかを記述します。1つのエントリーにつき1つの決定事項とし、日付と適用対象のリポジトリを記載します。

最初のドキュメントがアップロードされ、各ファイルが検索可能なメモリとしてリストされているMemoryLakeワークスペース
最初のドキュメントがアップロードされ、各ファイルが検索可能なメモリとしてリストされているMemoryLakeワークスペース

ステップ3:AIとエージェントを接続する

Codexや、使用している他のアシスタントを接続します。フォークされたチャットであれ、新しいチャットであれ、次のチャットはすでに決定された事項を踏まえて開始できます。

メモリレイヤーに接続可能なAIクライアントとエージェントフレームワークがリストされているMemoryLakeの統合画面
メモリレイヤーに接続可能なAIクライアントとエージェントフレームワークがリストされているMemoryLakeの統合画面

実践においてこれがもたらす変化

最初の違いは、実験によって元のチャットがリスクにさらされなくなることです。worktreeを使用することで、フォークは独自のファイルを持ち、元のコードはそのまま維持されます。

2つ目は、チャットを区別できるようになることです。チャットに名前を付け、いつフォークし、いつ /side を使用するかという明確なルールを設けることで、セッションリストの視認性が保たれます。

3つ目は、結果がフォーク内に取り残されないことです。結論を元のチャット、AGENTS.md、または自分で管理しているリストに書き込んでおくことで、次のチャットでもその発見を把握できます。後で古いチャットやフォークを見つける必要がある場合は、Codexがそれらをどこに保管しているかをカバーした見つからないCodexチャット履歴を探すためのガイドをご覧ください。新しいチャットがプロジェクトを記憶していない理由については、Codexがプロジェクトのコンテキストを忘れてしまう理由に関するガイドを参照してください。

Codexチャットをフォークする際のベストプラクティス

作業が分岐する場合にのみフォークする。 同じ問題の次のステップであれば、同じチャットに留まります。

質問には /side を使用する。 完全なフォークを作成することなく、メインのトランスクリプトから寄り道を排除できます。

コードを変更する場合はworktreeにフォークする。 そうしないと、両方のチャットが同じファイルを編集することになります。

.worktreeinclude を一度設定しておく。 設定しておかないと、.env などのプロジェクトに必要な無視されたファイルが新しいworktreeに含まれません。

両方のチャットに名前を付ける。 /rename を使用して、ピッカーでどのアプローチであるかがわかるようにします。

フォーク先で /memories を確認する。 実験内容を将来のメモリに反映させるべきかどうかを判断します。

結果を持ち帰る。 継続するチャット、または永続化させる必要がある場合は AGENTS.md に決定事項を書き込みます。

結論

Codexチャットをフォークすると、会話が新しいIDを持つ新しいチャットにコピーされ、元のチャットはそのまま残ります。現在のチャットを /fork でフォークしたり、保存されたチャットを codex fork でフォークしたり、過去の時点からEscapeショートカットでフォークしたり、/side でサイドの質問をしたりできます。ただし、worktreeを選択しない限り独自のファイルは作成されず、発見した内容が自動的にマージされることもなく、共有されたスナップショットからフォークすることもできません。

作業が本当に分岐するかどうかを判断し、両方のチャットがコードを編集する場合はworktreeにフォークし、両方のチャットに名前を付け、完了したら結果を持ち帰りましょう。そうすることで、実験は元のチャットを置き換えるのではなく、それを補完するものになります。

よくある質問

Codexでチャットをフォークするにはどうすればよいですか?

Codex CLIで、コピーしたいチャット内で /fork と入力します。保存されたチャットをフォークするには、codex fork を実行してセッションピッカーを開くか、最新のセッションを対象とする場合は codex fork --last を実行します。

Codexチャットをフォークすると、元のチャットは変更されますか?

元のトランスクリプトはそのまま残ります。Codexは新しいIDを持つ新しいチャットを作成します。ただし、両方のチャットが同じディレクトリで動作している場合、一方で行われたファイルの変更はもう一方にも反映されます。

過去のメッセージからCodexチャットをフォークすることはできますか?

はい、可能です。Codex CLIで、コンポーザーが空の状態でEscapeキーを2回押すと、前のメッセージを編集してその時点からフォークできます。Codexの変更履歴(changelog)にも、過去のメッセージからチャットをフォークする機能が記録されています。

Codexチャットを新しいworktreeにフォークするにはどうすればよいですか?

セッションIDと --worktree を指定して codex fork を実行するか、/fork でチェックアウトの選択肢が表示されたときに新しいworktreeを選択します。worktreeオプションを使用するには、CLIでのローカル実行と明示的なセッションIDが必要です。

Codexにおける /fork と /side の違いは何ですか?

/fork は、切り替えて継続できる完全な新しいチャットを作成します。/side は、メインチャットから離れることなく、特定の質問に集中するための一時的なサイドチャットを開きます。

共有されたCodexチャットをフォークすることはできますか?

いいえ、できません。OpenAIのドキュメントによると、共有されたスナップショットから元のスレッドをフォークすることはできません。スナップショットを添付ファイルとしてインポートし、新しいチャットで参照することは可能です。