AIコーディングエージェントの変更を元に戻す方法
AIコーディングエージェントの編集を安全に元に戻す方法です。ファイル単位の復元、未コミットの変更の破棄、エージェントのコミットの取り消しを、自分の作業を失わずに行います。
AIコーディングエージェントの変更を元に戻すには、何が変わったかを確認してから、それに合うGitコマンドを使います。編集されたファイルにはgit restore、新しいファイルにはgit clean、コミットにはgit revertです。その前にgit stashで安全のためのコピーを取っておきます。Claude Code自体の/rewindでもコードを戻せますが、すべての変更を追跡しているわけではありません。
この記事は、作業を捨てると決めたあとの手順を説明します。捨てるかどうかの判断にはAIによるコード変更の確認方法が役立ちます。Monoは変更内容を表示しますが、元に戻す機能はないので、Monoを使う場合もコマンドは同じです。
1. エージェントを止めて変更を確認する
まずエージェントを止めます。Monoでは、エージェントの作業中は送信ボタンがキャンセルボタンに変わります。プロジェクトのフォルダーで開いたターミナルで、次を実行します。
git status
git log --oneline -51つ目は、変更、削除、ステージ済み、新規のファイルを一覧表示します。2つ目は、エージェントが作ったものも含めて最近のコミットを表示します。どの変更が自分のものかを控えておきましょう。元に戻すコマンドは、誰がその行を書いたかを区別しません。
| 表示される状態 | 元に戻す方法 |
|---|---|
| ステージされていない変更済み・削除済みのファイル | git restore <path> |
| ステージ済みの変更 | git restore --staged <path>のあと、ファイルを元に戻す |
| 追跡されていない新しいファイル | git clean -n <path>のあとgit clean -f <path> |
| 望んでいないコミット | git revert <commit> |
Monoの「変更点を表示」は、直前のコミット以降に変更されたファイルと新しいファイルを一覧にします。そのため、エージェントが作ったコミットは表示されません。
2. 先に安全のためのコピーを保存する
restoreとcleanは、コミットしていない作業を完全に破棄します。先にすべてを保存しておきます。
git stash push --include-untracked -m "before undo"
git stash apply --index1つ目は変更したファイルと新しいファイルを保存して作業ツリーをきれいにし、2つ目はステージ済みの状態を保ったままそれらを戻します。見た目は何も変わりませんが、git stash listには「before undo」という名前のコピーが残ります。
戻しすぎた場合は、git restore --source "stash@{0}" <path>で、最新のstashから編集済みのファイルを取り戻せます。
3. 1つのファイルや、その一部だけを元に戻す
範囲がいちばん狭いコマンドを選びます。
git restore <path>は、そのファイルのステージされていない編集を破棄します。git restore --staged <path>は、変更をステージから外しますが、ファイルの編集はそのまま残します。git restore -p <path>は、変更された部分(ハンク)ごとに確認します。あなたとエージェントが同じファイルを編集したときに役立ちます。git clean -n <path>は、git clean -f <path>で削除される追跡されていないファイルを一覧表示します。パスは必ず指定してください。
各オプションはgit restoreのドキュメントで説明されています。
4. エージェントが残した未コミットの変更をすべて元に戻す
自分の変更が1つもなければ、プロジェクトのルートでgit restore --staged --worktree .を実行してすべて破棄し、新しいファイルにはgit clean -n .とgit clean -f .を使います。自分の変更が含まれている場合は、パスを指定して作業します。
架空の例で説明します。「tidy-recipes」プロジェクトで、CSSクラス.btn-primaryの名前を.button-mainに変えるようエージェントに頼みました。エージェントはそれ以前に、誰も頼んでいないロックファイルの更新をコミットしていました。今回は3つのファイルでクラス名を変え、関係のない12個のファイルを整形し直し、styles/tokens.cssを作成しました。その間にあなたはREADME.mdを手で編集していて、その変更は残したいとします。
安全のためのコピーを取ったら、エージェントが変更したファイル(ここではsrc/とstyles/main.css)を元に戻し、新しく作られたファイルを削除します。
git restore src/ styles/main.css
git clean -n styles/tokens.css
git clean -f styles/tokens.cssここでgit restore .は使わないでください。READMEの編集まで破棄されてしまいます。src/の中にも自分の編集があるなら、エージェントのファイルを1つずつ指定します。
これでgit statusにはREADME.mdだけが表示され、git diffには自分が書いた行だけが出ます。ロックファイルのコミットはまだ残っています。
5. エージェントがすでに作ったコミットを取り消す
git revertは、以前のコミットを打ち消す新しいコミットを記録します。git revertのドキュメントによると、作業ツリーがきれいな状態である必要があるので、先にREADMEの編集を退避させます。
git stash push -m "readme" README.md
git revert <lockfile commit>
git stash popハッシュはgit logで確認したものを使い、メッセージの編集画面を省くには--no-editを付けます。git stash popは「readme」を戻し、「before undo」は一覧に残します。これでgit statusにはREADME.mdだけが表示され、git log --onelineのいちばん上にRevert "Update lockfile"が表示されます。
プッシュ済みのコミットには、git resetではなくrevertを使いましょう。resetは、ほかの人がすでに取得しているかもしれない履歴を書き換えます。resetやrebaseのあとでコミットが失われたように見えるときは、git reflogで、直近で作業していたコミットをハッシュ付きで確認できます。
6. エージェントのチェックポイントを使い、Gitを予備にする
Claude Codeは、プロンプトを送るたびにその前の時点のチェックポイントを保存します。/rewindを実行するか、プロンプトが空の状態でEscキーを2回押すと、コード、会話、またはその両方を戻せます。チェックポイントのドキュメントには制限が書かれています。シェルコマンドによる変更は追跡されない、外部での編集は通常記録されない、チェックポイントはバージョン管理の代わりにならない、という点です。使えるかどうかは、エージェントを動かすアプリによっても変わります。
そのため、Gitを予備の手段にしておきます。
- タスクの前に毎回コミットするかブランチを作り、「直前のコミット」が「エージェントが作業する前」を指すようにする。
- 確認なしにコミットしないよう、AGENTS.mdファイルなどでエージェントに伝える。
- 承認をオンのままにする。エージェントのリクエストをすべて受け入れるMonoのYOLOモードは、初期設定でオフです。許可する前に確認することも参考にしてください。
Monoでは、プロジェクトのカードから、パソコン上のプロジェクトフォルダーでターミナルを開けます。スマートフォンからも開けます(リモートコーディングのガイドを参照)。Monoはまだ公開前ですが、ウェイトリストに登録できます。
