- ChatGPTの「←2/6→」が消えた?編集した会話の分岐をJSONから復元できた方法
- ChatGPTの編集分岐が消えてもデータ自体は残っている場合がある
- ただし「childrenが複数=全部ユーザーの編集分岐」ではない
- ChatGPTの消えた編集分岐を復元する手順
- STEP1:復元したいChatGPTチャットを開く
- STEP2:会話JSONと生成画像情報を保存する
- STEP3:保存したJSONを新しいChatGPTへ添付する
- STEP4:ChatGPTへ分岐復元の指示を出す
- なぜ一度に全部復元せず「次」で進めたのか
- 画像付きChatGPTチャットも復元できた
- 実際に画像の分岐まで特定できた例
- ユーザーがアップロードした画像1・画像2も復元できる
- 復元できるもの・できないもの
- 公式のデータエクスポートを使う方法もある
- ChatGPTには現在もメッセージ編集や分岐機能がある
- ChatGPTの編集分岐を復元するときの注意点
- 私が実際に復元して分かったこと
- ChatGPTの「←2/6→」が消えて困っているなら、まずJSONを確認する価値はある
ChatGPTの「←2/6→」が消えた?編集した会話の分岐をJSONから復元できた方法
ChatGPTで過去のメッセージを編集していると、以前は「←2/6→」「←3/4→」のような表示から、編集前後の会話を切り替えられることがありました。
ところが私の環境では、ある日その編集分岐の切り替え表示が見えなくなり、過去の回答へ戻れない状態になりました。
かなり困ったのですが、調べてみると画面から見えなくなっただけで、会話データのJSONには過去の分岐が残っているケースがありました。
実際に私のチャットを調べたところ、mapping の中にある parent と children をたどることで、消えた編集分岐の文章を順番どおり復元できました。
さらに、画像生成を含むチャットについても、asset_pointer や file ID を照合することで、「どの分岐でどの画像を生成したのか」までかなり正確に復元できました。
この記事では、私が実際に行ったChatGPTの編集分岐をJSONから復元する方法を、できるだけ分かりやすくまとめます。
なお、ここでいう「復元」は、元のChatGPT画面に「←2/6→」のボタンを復活させるという意味ではありません。
JSONに残っている会話内容や画像の対応関係を取り出し、新しいチャット上で読める形に再構成する方法です。
ChatGPTの編集分岐が消えてもデータ自体は残っている場合がある
私の環境で起きたこと
私が困ったのは、1つのChatGPTチャットの中で何度もメッセージを編集していたケースでした。
たとえば、同じ位置のユーザーメッセージを編集すると、以前は次のような表示がありました。
・←1/3→
・←2/3→
・←3/3→
これを切り替えることで、編集する前の質問と、それに対するChatGPTの回答を確認できていました。
ところが、その切り替え表示が見えなくなりました。
チャットそのものは残っています。
しかし、画面上では現在選択されている1本の会話しか確認できません。
最初は「過去の分岐が削除されたのでは」と思いました。
しかし、会話JSONを確認すると、過去のメッセージノードがまだ残っていました。
ChatGPTの会話は単純な上から下の文章ではない
JSONを見て重要だったのが、mapping という構造です。
イメージとしては次のようになっています。
mapping
├─ message A
│ └─ children
│ ├─ message B
│ └─ message C
│
└─ message D
各メッセージには、おおむね次のような情報があります。
| 項目 | 意味 |
|---|---|
id |
メッセージやノードの識別子 |
message |
実際のユーザー・GPTメッセージ |
parent |
1つ前の親ノード |
children |
その先につながる子ノード |
create_time |
作成された時刻 |
content |
メッセージ本文など |
特に重要なのがparent と childrenです。
同じ親から複数の子ノードへ分かれている場所を調べると、編集によって生まれた過去の会話ルートを見つけられる場合があります。
ただし「childrenが複数=全部ユーザーの編集分岐」ではない
画像生成チャットでは内部処理の分岐も混ざる
ここは実際に復元していて一番ややこしかった部分です。
単純に、
children が2個ある
↓
2分岐だ
と判断すると、間違うことがあります。
ChatGPTでは画像生成や内部処理の途中に、
・tool
・reasoning
・reasoning_recap
・thoughts
・内部code
などのノードが入ることがあります。
そのため、ChatGPT内部の処理によって生じた技術的なフォークまで「ユーザーが編集した分岐」と数えてしまうことがあります。
私の場合も、実際にはユーザーから見える編集分岐ではないノードが混ざっていました。
復元するときに除外したもの
私は基本的に次のように整理しました。
ユーザーの分岐として扱うもの
・ユーザーが入力した通常メッセージ
・編集後に生まれた別のユーザーメッセージ
・それぞれに続く通常のGPT回答
分岐数には含めないもの
・thoughts
・reasoning
・reasoning_recap
・内部codeだけのノード
・tool処理だけで生じた技術的フォーク
ただし、toolノードに画像情報が入っていることがあります。
そのため、分岐数には数えないけれど画像の特定には利用するという扱いにしました。
ChatGPTの消えた編集分岐を復元する手順
全体の流れ
実際に行った作業は次の流れです。
- 復元したいChatGPTチャットをPCで開く。
- ChromeまたはEdgeのDevToolsを開く。
- Consoleから対象チャットの会話JSONを取得する。
- 生成画像の情報も一緒に取得する。
recovery-...-with-images.jsonとして保存する。- 新しいChatGPTチャットを開く。
- 保存したJSONを添付する。
- 復元用の指示文を送る。
- 「次」と送りながら分岐を古い順に確認する。
- 最後に全分岐を1つのテキストへまとめる。
この方法のメリットは、人間が巨大なJSONを手作業で読む必要がないことです。
JSONそのものをChatGPTへ渡し、分岐構造の解析を任せます。
STEP1:復元したいChatGPTチャットを開く
まず、PCブラウザで復元したいチャットを開きます。
私が使ったのはChromeです。
EdgeでもChromium系なので、基本的な操作方法はほぼ同じです。
対象チャットを開いた状態で、
F12
を押します。
DevToolsが表示されたら、
Console
を開きます。
Consoleを使う前の注意点
ここはかなり重要です。
内容を理解していないコードをDevToolsのConsoleへ貼り付けるのは危険です。
Consoleで実行するJavaScriptは、そのページ上で動作します。
悪意のあるコードなら、ログイン中のサービスから情報を読み取ることも可能です。
今回紹介するコードについても、少なくとも、
・外部ドメインへ情報を送信していないか
・Cookieなどを外部へ送っていないか
・何を取得しているのか
を確認したうえで使用してください。
また、復元作業のためにアクセストークン、Cookie、Authorizationヘッダー、HARファイルを他人へ送る必要はありません。
これらを「確認のために送ってください」と言われても、安易に共有しないほうが安全です。
STEP2:会話JSONと生成画像情報を保存する
私が使ったConsole用コード
私の場合は、対象チャットの会話情報と画像生成履歴を1つのJSONにまとめました。
(async () => {
const cid = location.pathname.match(/\/c\/([0-9a-f-]{36})/i)?.[1];
if (!cid) throw new Error(
"対象チャットを開いてから実行してください。"
);
const sessionRes = await fetch("/api/auth/session", {
credentials: "include"
});
const session = await sessionRes.json();
const token = session?.accessToken;
if (!token) throw new Error(
"セッション情報を取得できませんでした。"
);
const headers = {
Authorization: `Bearer ${token}`
};
const convRes = await fetch(
`/backend-api/conversation/${cid}`,
{ headers }
);
if (!convRes.ok) throw new Error(
`conversation取得失敗: ${convRes.status}`
);
const conversation = await convRes.json();
const images = [];
let after = null;
for (let page = 0; page < 40; page++) {
const u = new URL(
"/backend-api/my/recent/image_gen",
location.origin
);
u.searchParams.set("limit", "25");
if (after !== null) {
u.searchParams.set("after", String(after));
}
const r = await fetch(u, { headers });
if (!r.ok) break;
const j = await r.json();
const batch =
Array.isArray(j) ? j :
Array.isArray(j.items) ? j.items :
Array.isArray(j.images) ? j.images :
Array.isArray(j.data) ? j.data : [];
if (!batch.length) break;
images.push(...batch);
const explicitNext =
j.next_after ??
j.nextAfter ??
j.after ??
j.cursor ??
null;
const fallbackNext =
batch.at(-1)?.created_at ?? null;
const next =
explicitNext ?? fallbackNext;
if (
batch.length < 25 ||
next === null ||
String(next) === String(after)
) break;
after = next;
}
const deduped = [...new Map(
images.map(x => [
x.id ??
x.asset_pointer ??
JSON.stringify(x),
x
])
).values()];
const relevantImages = deduped.filter(
x =>
!x.conversation_id ||
x.conversation_id === cid
);
const payload = {
format: "chatgpt_branch_and_image_recovery_v1",
exported_at: new Date().toISOString(),
conversation_id: cid,
conversation,
image_gallery: {
images: relevantImages
}
};
const blob = new Blob(
[JSON.stringify(payload, null, 2)],
{ type: "application/json" }
);
const a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download =
`recovery-${cid}-with-images.json`;
document.body.appendChild(a);
a.click();
a.remove();
setTimeout(
() => URL.revokeObjectURL(a.href),
1000
);
console.log(
`保存完了: ${a.download} / ` +
`images: ${relevantImages.length}`
);
})();
正常に動けば、
recovery-xxxxxxxx-with-images.json
というJSONファイルが保存されます。
このコードがしていること
ざっくり分けると次の処理です。
| 処理 | 内容 |
|---|---|
| チャットID取得 | 現在開いているチャットを特定 |
| セッション確認 | 自分のログインセッションをブラウザ内で利用 |
| conversation取得 | 対象チャットのmappingなどを取得 |
| image_gen取得 | 生成画像情報を取得 |
| conversation_id照合 | 対象チャットに関係する画像を抽出 |
| JSON化 | 会話と画像情報を1ファイルへまとめる |
| ダウンロード | PCへJSONを保存 |
アクセストークンをConsoleへ表示したり、私や第三者へ送信するためのコードではありません。
ただし、この方法ではChatGPT内部のWeb APIを利用しています。
そのため、ChatGPT側の仕様変更によってURLやレスポンス形式が変わり、将来動かなくなる可能性があります。
2026年8月時点で私が復元したときに使えた方法として考えてください。
STEP3:保存したJSONを新しいChatGPTへ添付する
JSONが保存できたら、新しいChatGPTチャットを開きます。
そこへ、
recovery-...-with-images.json
を添付します。
元の壊れたチャット内で復元作業を続けるより、新しいチャットで解析専用にしたほうが整理しやすかったです。
STEP4:ChatGPTへ分岐復元の指示を出す
私が実際に使った復元指示文
JSONを添付したあと、次のような指示を出します。
添付した recovery-...-with-images.json を解析して、
ChatGPTで画面から消えた編集分岐を復元してください。
【復元対象】
conversation.mapping の parent / children を使い、
ユーザーが編集したことで生じた会話分岐を特定してください。
children が複数ある箇所を分岐点として扱い、
各兄弟ノードを create_time 順に
1/n、2/n、3/n… と並べてください。
【除外】
thoughts、reasoning、reasoning_recap、
内部code、tool処理だけで生じた技術的フォークは、
ユーザー可視の分岐数には含めないでください。
ただし、そのtoolノードに生成画像がある場合は、
対応画像の特定には利用してください。
【各分岐で復元するもの】
1. ユーザーのメッセージ全文
2. GPTの通常表示された回答全文
3. そのターンで生成された画像
4. 添付画像・人物リファレンスとの対応関係
文章は要約せず、
JSONに残っている本文をできるだけ原文のまま復元してください。
【画像の対応付け】
mapping 内の
image_asset_pointer / asset_pointer と、
image_gallery.images 内の
asset_pointer を照合してください。
優先順位は、
1. asset pointer / file ID の完全一致
2. gen_id / transformation_id の一致
3. 生成時刻・画像サイズなど
です。
完全一致できない画像を推測だけで特定しないでください。
曖昧な場合は
「断定できない」
と明記してください。
生成画像については、
・Imagesアーカイブ上のタイトル
・file ID
・asset pointer
・サイズ
・gen_id / transformation_id
を分かる範囲で記載してください。
【アップロード画像】
ユーザーが複数画像をアップロードしている場合は、
multimodal_text と
metadata.attachments
を確認し、
アップロード順を維持して
「画像1」「画像2」…との対応を復元してください。
【進め方】
最も古い未復元の分岐から開始してください。
一度に全部出さず、
まず1つの分岐バージョンだけ復元してください。
私が「次」と送ったら、
次のバージョンへ進んでください。
分岐の途中にさらに分岐がある場合も見落とさず、
階層関係が分かるようにしてください。
【安全】
アクセストークン、
Cookie、
Authorizationヘッダー、
HARファイルを私に要求しないでください。
JSON内にそれらが含まれていない限り、
追加提出を求めないでください。
なぜ一度に全部復元せず「次」で進めたのか
長いチャットほど順番確認が重要だった
最初は「全部まとめて復元して」と頼めば簡単だと思っていました。
しかし、実際のJSONには、
・2分岐
・その分岐の中にさらに2分岐
・途中から3分岐
・画像生成用toolノード
・内部的な技術フォーク
などが混ざっていました。
そのため、最初から一括出力すると、どの分岐を復元済みなのか分からなくなる可能性があります。
そこで、
1/2を復元
↓
次
↓
2/2を復元
↓
次
↓
その中の1/3を復元
という方法にしました。
地味ですが、この方法がかなり確実でした。
画像付きChatGPTチャットも復元できた
一番難しかったのは「どの画像がどの分岐か」
文章だけなら、parent と children をたどれば比較的分かりやすいです。
問題は画像でした。
私のチャットには、
・ユーザーがアップロードした人物画像
・編集対象画像
・人物リファレンス画像
・ChatGPTが生成した画像
・同じ人物を編集した別バージョン
が大量に含まれていました。
Imagesアーカイブには生成画像が残っていても、画像を見ただけでは「どの分岐で生成したものなのか」が分かりません。
asset_pointerが画像復元の重要な手掛かりだった
画像生成toolノードには、たとえば次のような情報が残っています。
asset_pointer:
sediment://file_xxxxxxxxx
Imagesアーカイブ側にも同じ、
asset_pointer
が存在することがあります。
この2つを照合すると、
会話中の画像生成ノード
=
Imagesアーカイブにある実際の生成画像
という対応を取れます。
画像はこの優先順位で照合した
私の場合は次の順番にしました。
| 優先度 | 照合情報 | 信頼度 |
|---|---|---|
| 1 | asset_pointer完全一致 | 非常に高い |
| 2 | file ID完全一致 | 非常に高い |
| 3 | gen_id / transformation_id | 高い |
| 4 | created_at | 補助情報 |
| 5 | 幅×高さ | 補助情報 |
| 6 | 見た目だけ | 原則使わない |
特に大事なのは、画像の雰囲気だけで決めつけないことです。
似た人物画像を連続生成している場合、見た目だけで判断すると簡単に取り違えます。
実際に画像の分岐まで特定できた例
私の場合、画像編集の途中に、
STEP A
↓
STEP B
↓
STEP B改訂版
↓
STEP C
という複数段階の処理がありました。
JSONとImagesアーカイブを照合すると、
元画像
↓
STEP Aで生成された画像
↓
STEP Bで生成された画像
↓
改訂版で生成された別画像
という流れまで追跡できました。
さらに、画像生成後の通常GPT回答が空文字になっているケースもありました。
画面上では画像だけが表示されたターンです。
こうした場合も、toolノードにある asset_pointer を確認すれば、「GPTの文章はないが、この位置で画像が生成された」と判断できます。
ユーザーがアップロードした画像1・画像2も復元できる
metadata.attachmentsも確認する
生成画像だけでなく、ユーザーがアップロードした画像の順番も重要です。
私の場合、
画像1
画像2
画像3
…
画像10
という複数の人物画像を使っていました。
JSON内の、
multimodal_text
や、
metadata.attachments
を確認すると、
・file ID
・ファイル名
・幅
・高さ
・アップロード順
などが残っている場合があります。
これを使うことで、当時「画像2」「画像7」と呼んでいた画像がどのファイルなのかまで復元できました。
復元できるもの・できないもの
今回の方法で復元できたもの
| 内容 | 結果 |
|---|---|
| 編集前のユーザーメッセージ | 復元できた |
| 編集後のユーザーメッセージ | 復元できた |
| 各分岐のGPT回答 | 復元できた |
| 2分岐・3分岐などの順番 | 復元できた |
| 分岐の中のさらに別分岐 | 復元できた |
| 生成画像の対応 | 多くを特定できた |
| アップロード画像の順番 | 確認できた |
| 画像のfile ID | 確認できた |
| asset_pointer | 確認できた |
今回の方法では戻らないもの
一方で、次のものは別です。
・元の「←2/6→」UIそのもの。
・元チャットの画面状態そのもの。
・削除済みでJSONにも存在しない内容。
・asset pointerなどの証拠がなく、完全に特定できない画像。
つまり、元画面を修理する方法ではなく、残っているデータから会話を再構築する方法です。
公式のデータエクスポートを使う方法もある
ChatGPTには公式のデータエクスポート機能もあります。
OpenAI公式ヘルプでは、設定の「データ管理」からデータエクスポートを申請でき、エクスポートには会話履歴が含まれると案内されています。(OpenAI Help Center)
また、エクスポートされた conversations.json を新しいChatGPTチャットへアップロードし、参照用として使う方法も公式に案内されています。(OpenAI Help Center)
ただし公式説明でも、JSONをアップロードすることで以前のチャット一覧や元のサイドバーがそのまま復元されるわけではないとされています。(OpenAI Help Center)
DevToolsを使いたくない人は公式エクスポートがおすすめ
Consoleを使うのが不安なら、まず公式のデータエクスポートを試したほうが安心です。
一方、私の場合は対象チャット1件について、会話構造と生成画像情報をまとめて解析したかったため、今回の方法を使いました。
内部APIを利用する方法は便利ですが、公式に保証された公開APIではないため、将来使えなくなる可能性があります。
ChatGPTには現在もメッセージ編集や分岐機能がある
OpenAI公式ヘルプでは、Web版で自分のメッセージを編集できることや、以前の地点から「新しいチャットで分岐」できることが案内されています。(OpenAI Help Center)
また、ChatGPTのリリースノートでは、Web版の「Branch in new chat」が2025年9月に追加されたことも案内されています。(OpenAI Help Center)
ただし、今回私が復元したのは過去に同じチャット内で編集した際にできていた「←2/6→」のような履歴です。
現在提供されている「新しいチャットで分岐」とは、見た目や使い方が同じとは限りません。
ChatGPTの編集分岐を復元するときの注意点
アクセストークンやCookieを他人に渡さない
復元方法を調べていると、ネット上の誰かから、
Authorizationヘッダーを貼ってください
Cookieを送ってください
HARファイルをアップロードしてください
と言われる可能性があります。
しかし、これらにはアカウントへアクセスするための重要な情報が含まれる可能性があります。
第三者へ安易に送らないでください。
自分で理解できないConsoleコードを実行しない
Consoleコードも同じです。
今回掲載したコードに限らず、
「このコードをF12のConsoleへ貼ってください」
という方法は、内容を確認してから実行するべきです。
特に、
fetch("https://見知らぬドメイン...")
のように、外部サイトへデータを送信する処理が入っていないかは確認したほうが安心です。
復元できない画像を無理に特定しない
これは精度面で重要です。
画像について、
たぶんこれ
という判断で復元すると、後から全体の順番まで崩れます。
完全一致するIDがないなら「断定できない」と残すほうが安全です。
私が実際に復元して分かったこと
今回かなり長いチャットを復元しましたが、一番驚いたのは、画面上では消えたように見える分岐でも、JSONの中ではかなり詳細に残っていたことです。
しかも単に文章だけではありません。
parent と children をたどることで、どの質問からどの回答へ分かれたのかという会話の木構造まで確認できました。
さらに画像生成の場合は、asset_pointer を使うことで、Imagesアーカイブに残っている画像との対応も取れました。
最終的には、復元した分岐を1つのテキストファイルへまとめ、
・分岐ポイント。
・1/2、2/2などの順番。
・ユーザーの質問。
・GPTの回答。
・生成画像のタイトル。
・file ID。
・asset pointer。
・画像サイズ。
・gen_id。
まで整理できました。
ChatGPTの「←2/6→」が消えて困っているなら、まずJSONを確認する価値はある
画面から過去の編集分岐が見えなくなったからといって、必ずしも会話データそのものが消えているとは限りません。
少なくとも私のケースでは、conversation.mapping の中に分岐が残っており、そこからかなりの内容を復元できました。
ポイントをまとめると、次の5つです。
・mapping の parent / children を確認する。
・内部toolフォークをユーザー編集分岐と混同しない。
・画像はasset_pointerやfile IDの完全一致を優先する。
・巨大なJSONはChatGPTに解析させ、「次」で1分岐ずつ確認する。
・アクセストークンやCookieなどの機密情報を他人へ渡さない。
ChatGPTを長期間使っていると、重要なプロンプトや試行錯誤が1つのチャットに大量に蓄積されることがあります。
私も「もう戻せないかもしれない」と思いましたが、JSONを調べたことで救出できました。
同じようにChatGPTの編集履歴、分岐、過去の回答、生成画像が消えて困っている人は、諦める前に会話JSONを確認してみる価値があります。

