FRL 自由研究ラボ

AIエージェントことはじめ — LAB 006

AIが壊しても戻れるようにする(後編)

AI にコードを書かせていると、いつか必ず「さっきまで動いていたのに」が来ます。 そのとき戻れるかどうかは、壊れる前に決まっています。 GitHub はまだ使いません。自分の Mac 1台の中だけで、戻れる状態を作ります。 後編では、記録を AI に任せる頼み方と、実際に戻す手順を扱います。

約10分

全部やる場合

2 STEP

手順の数

Mac 1台

2台目は LAB 008

この記事の道順

  1. 前編のおさらい
  2. STEP 5 — AI に記録させる
  3. STEP 6 — 戻す
  4. もうコピーしてしまっていたら
  5. つまずき集(症状から引く)
  6. よくある質問
  7. 次の一歩

※ LAB 003(Claude Code と Obsidian をつなぐ) と、前編(STEP 1〜4)を終えている前提です。

RECAP

前編のおさらい

前編では、置き場所を決めて git を始め(STEP 1・2)、 合言葉などの「コピーしないもの」を先に決めて(STEP 3)、 最初のセーブポイントを作りました(STEP 4)。ここまでで、戻れる場所はもうあります。

後編では、そのセーブポイントをAI に作らせる頼み方と、 壊れたときに実際に戻す手順を扱います。用語(git・コミット・リポジトリ)は前編の「用語は3つだけ覚える」にあります。

05

STEP 5 — 目安 5分

AI に記録させる

ここまでの手順は、人が毎回打つには多すぎます。前回 CLAUDE.md に 「直したらノートに書く」と書いたのと同じ要領で、コピーするのも AI の仕事にします。 ただし、任せ方に1つだけ決まりを作ります。

5-1. なぜ「全部まとめて」を禁じるのか

git には「変わったもの全部を一気に選ぶ」便利な書き方があります (git add -A。よく似たgit add .も、 いま居るフォルダから下を丸ごと選ぶという点でほぼ同じ働きをします)。 AI は放っておくとこれを使います。速いからです。ですが、これを許すと 門が1枚しかない状態になります。

✕ 全部まとめて(git add -A) app.py .env(鍵) 下書き_秘密.txt ※3つ目は AI がさっき作った  新しいファイル .gitignore 門その1 .env は止まる 誰も見ないまま通る 履歴に入ってしまう .gitignore に書いていないものは、素通りする = 思いついていなかったものは守れない ○ 選んで足す(名前を並べる) app.py .env(鍵) 下書き_秘密.txt .gitignore 門その1 人が見る 門その2 名前を並べる 知らなかったものは、ここで止まる app.py だけが履歴に入る 選ばれなかった2つは、フォルダに残るだけ .gitignore は「知っているもの」しか弾けない。 知らなかったものを止めるのが、2枚目の門。

.gitignore は自分が思いついたものしか弾けません。 AI は作業の途中で、こちらが知らないファイルを勝手に作ります。 その「思いついていなかったもの」を止められるのは、名前を並べて選ぶという手間だけです。 面倒に見えますが、ここが最後の砦です。

5-2. CLAUDE.md に書く

CLAUDE.md に、この節を足します。そのまま使えます。 CLAUDE.md は起動したフォルダの直下にあるものが読まれるので、 ~/code で起動するなら ~/code の中のものに足します (まだ無ければ、会話画面で /init と打つとたたき台ができます。前回の CLAUDE.md を別のフォルダに作っていた場合、それはそのフォルダで起動したときだけ読まれます)。 自分で開いて貼ってもよいですし、AI に「この内容を CLAUDE.md の末尾に足して」と頼んでも構いません。

## 記録の残し方

- 何か直して、動くのを確かめたら、そこで1枚コミットする
- コミットの名前は日本語で。何をしたか+なぜそうしたかを1行で
- **`git add -A` と `git add .` は使わない。**
  触ったファイルを名前で指定する。迷ったら `git status` を読んでから
- 合言葉や個人のデータらしきファイルを見つけたら、
  コミットせずに先に報告する

✓ ここまでの確認: 何か小さな修正を頼んで、こちらが言わなくてもコミットされ、 git log --oneline に日本語の行が増えている。

06

STEP 6 — 目安 5分

戻す

ここまでが「保険をかける」話で、ここからが「使う」話です。 戻し方はどこまで戻したいかで3つに分かれます。

a1b2c3de4f5g6h i7j8k9lいまここ まだコピー していない変更 ① コピーする前の変更を捨てる AI が触った直後、動かなくなったとき git restore ファイル名 ② 1つのファイルだけ昔に戻す 1枚だけおかしい所が分かっているとき git restore --source=e4f5g6h ファイル名 ③ コピーしてしまった1枚を打ち消す git revert i7j8k9l ← 履歴は消さず、打ち消す1枚を足す
こうなったら 打つもの
AI が触った直後に動かなくなった(まだコピーしていない) git restore ファイル名
1つのファイルだけ、前の版に戻したい git restore --source=背番号 ファイル名
コピーしてしまった1枚を無かったことにしたい git revert 背番号

表の1行目・2行目(git restore)は、そのファイルの「コピーしていない変更」を元に戻せなくします。 対象は指定した1ファイルだけですが、打つ前に git status(どのファイルが変わったか)を見て、 ファイル名を確かめてください。名前はそこに出ている通りに書きます。 表の「背番号」は、前編 STEP 4 の git log --oneline で調べます。

git revert を打つと、打ち消すセーブポイントの名前を書き直す画面(Vim という文字だけのエディタ)が開くことがあります。 そのときは何も変えずに :wq と打って Enter を押せば先へ進みます。 最初から開かせたくなければ git revert --no-edit 背番号 と打ちます。

いちばん実用的なのは、AI に頼むことです。 Claude Code は git を扱えるので、慌てているときはこう言えば足ります。 背番号を調べるのも AI にやらせられます。

さっきの変更で動かなくなった。
直前のコミットの状態に戻して。何を戻すか先に見せて。

git reset --hard だけは自分で打たないでください。 検索するとよく出てきますが、コピーしていない変更を問答無用で消します。 上の3つで足りますし、足りないときは AI に「取り返しのつく方法で」と添えて頼む方が安全です。

LEAK

もうコピーしてしまっていたら

.gitignore を作る前に何枚かコピーしていた、という順番になることはよくあります。 落ち着いて手当てすれば大丈夫ですが、「ファイルを消せば終わり」ではないという一点だけ、 先に頭に入れてください。

1枚目2枚目 3枚目4枚目(いま) 鍵が入った まだ入っている 消した 最新の状態からは消えた 過去の1枚1枚の中には、そのまま残っている 戻れば読める=値はまだ生きている だから手当ては3つセットで、効き目があるのは3つ目だけです。 ① 追い出す → これからコピーされなくなるだけ ② .gitignore に足す → 再発を防ぐだけ ③ そのパスワードを変える → 漏れを止めるのはこれだけ

① 追い出す(ファイルは手元に残ります)

git rm --cached 秘密のファイル名

--cached が付いているのでファイル自体は消えません。 「git の管理から外す」だけです。

② .gitignore に足して、もう一度コピーする

秘密のファイルの名前を .gitignore に1行足します(AI に「このファイル名を .gitignore に足して」と頼むのが早いです)。 そのあと、①で「管理から外した」記録をコピーして残します。

git add .gitignore
git commit -m "鍵のファイルを管理から外した(今後は .gitignore で除く)"

これで今後は入らなくなります。ここまでは、どちらも「これから」の話です。

③ そのパスワードを変える(これが本命)

過去のセーブポイントの中に値が残っている以上、その値はもう「見られた前提」で扱うのが正解です。 サービス側で新しいパスワードや鍵に取り替えてしまえば、残っている古い値はただの文字列になります。 歴史から消そうとするより、値を無効にする方が早くて確実です。

歴史そのものから消す方法もありますが、過去のセーブポイントを全部書き換える破壊的な作業で、 1台で使っている今の段階では割に合いません。 先に③を済ませてください。それさえ済んでいれば、残っていても実害はありません。 ——そしてLAB 008 で GitHub に上げる前に、この片付けを終えておく必要があります。 自分の Mac の中で済んでいるうちは、まだ引き返せます。

TROUBLE

つまずき集(症状から引く)

起きていること 原因 どうするか
Please tell me who you are 名前とメールをまだ登録していない 前編 STEP 2-2 の2行を実行する
fatal: not a git repository 対象のフォルダの外で打っている cd でフォルダへ移動してから打ち直す
.gitignore に書いたのに一覧から消えない それより前に1度コピーされている git rm --cached で追い出す(もうコピーしてしまっていたらへ)
no changes added to commit や nothing added to commit と出てコピーされない 先に git add で選んでいない(または変更が無い) git status で変わったファイルを確かめ、git add 名前 で選んでから git commit を打ち直す
行の先頭に dquote>(または >)だけが出て、何を打っても進まない -m "…" のダブルクォート " を閉じ忘れている control を押しながら C で抜けて、打ち直す
git log から抜けられない 一覧を見るモードに入っている q キーを1回押す
違う場所で git init してしまった ホームフォルダなどで打った そのフォルダの .git を消せば元通り(他のファイルは無事)。.git は隠しフォルダで Finder には出てこないので、AI に「このフォルダの .git を消して」と頼むのが早い
AI が勝手に git add -A を使う 速い書き方を知っているため CLAUDE.md に禁止と理由を書く(STEP 5-2)
コミットが増えすぎて戻り先が探せない 名前が「修正」「更新」ばかりになっている 名前に「なぜ」を入れる。探すのは AI に頼む
フォルダが妙に重くなった 動画・画像・書き出したデータをコピーしている 「作り直せるもの」は .gitignore へ回す

FAQ

よくある質問

Mac が1台しかなくても意味がありますか?

あります。むしろ1台のときこそ本体です。git の中心は「戻せること」で、複数のコンピュータで同期するのは後から付いてくる使い道にすぎません。この記事の範囲だけでも十分に元が取れます。

セーブポイントを増やすと容量を食いませんか?

コードや文章のようなテキストなら、ほとんど増えません。変わった部分だけを記録する仕組みだからです。太るのは画像・動画・書き出したデータをコピーしたときなので、それらは「作り直せるもの」として除いておきます。

Obsidian の Vault(ノートを入れておくフォルダ)も git に入れた方がいいですか?

この段階では不要です。ノートは「最新が読めればいい」もので、1行ごとの履歴を追う場面がほとんどありません。それに Obsidian 自体にファイル復元の機能があります。コードと系統を分けておく方が、LAB 008 の同期の話がすっきりします。

間違えてコミットしたら、完全に消せますか?

打ち消すことはできますが、歴史からは消えません。それが git の性質です。だから合言葉の類は「消す」ではなく「値を変える」で対処します(もうコピーしてしまっていたら)。

これだけでバックアップになりますか?

なりません。いま作った歴史は同じ Mac の中にあるので、Mac ごと壊れれば一緒に消えます。守れるのは「自分(と AI)が壊したとき」だけです。コンピュータの故障に備える話は、2つ先のLAB 008(2台の Mac と iPhone の回)で扱います。

NEXT

次の一歩

まずは1週間、何か直して動いたら1枚コピーするだけを続けてみてください。 戻したい場面は、思っているより早く来ます。そこで一度でも戻せたら、この仕組みは身に付きます。

  • 合言葉をコピーしてしまった心当たりがあるなら、先に片付けておいてください
  • LAB 008 で GitHub に上げると、片付け忘れたものも一緒に外へ出ます

LAB 007

スタバで仕事がしたかった — 外に持ち出すと決めた日から

次は、この記事の最後で触れた「外へ出す前に片付ける」の続きです。 カフェで作業しようと MacBook を持った日から、守るものが2つに増えました。 公衆Wi-Fi・覗き見・持ち出すコンピュータ・家の Mac への経路。 そのあと LAB 008 で、会話・ノート・コードのうち どれが自動で届き、どれが届かないかを扱います。

※ コマンドや画面の名称は、更新で変わることがあります。この記事は筆者が自分の Mac で実際に使っている手順をもとにしていますが、動作を保証するものではありません。 大事なデータを扱う前に、練習用のフォルダで一度試すことをおすすめします。