FRL 自由研究ラボ

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

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

AI にコードを書かせていると、いつか必ず「さっきまで動いていたのに」が来ます。 そのとき戻れるかどうかは、壊れる前に決まっています。 GitHub はまだ使いません。自分の Mac 1台の中だけで、戻れる状態を作ります。 前編では、git を始めて最初のセーブポイントを作るところまで進めます。

この記事を読むとできること

  • AI に書かせたものが壊れても、動いていた時点まで戻れる状態を、自分の Mac の中だけで作れるようになります
  • git(変更を記録していく道具)の「セーブポイント」を、自分の手で作れるようになります
  • パスワードなど「記録に入れてはいけないもの」を、最初のセーブポイントより先に除けるようになります

想定している使い方

Claude Code が使えるところまで(LAB 003)終わっている前提です。 ターミナル(文字で命令を打ち込むアプリ)から git と Claude Code を使います。 説明はすべて Mac を前提にしています。GitHub(インターネット上の置き場所)は使いません。

この記事の道順

  1. はじめに — AI だから戻れない3つの理由
  2. 用語は3つだけ覚える
  3. STEP 1 — 置き場所を決める
  4. STEP 2 — git を始める
  5. STEP 3 — 先に「コピーしないもの」を決める
  6. STEP 4 — 最初のセーブポイントを作る
  7. 後編へ — AI に記録させる・戻す

※ LAB 003(Claude Code と Obsidian をつなぐ) を終えている前提で書いています。ターミナルの開き方などはそちらに戻ってください。

読む目安:約10分 ・ 手を動かす目安:約30分(STEP 1〜4)・ 全2回の前編

INTRO

「さっきまで動いていたのに」は必ず来ます。

前回、AI の作業場のとなりに Obsidian を置いて、なぜそう直したかがノートに残るようにしました。 ただ、ノートに残るのは言葉です。 壊れたときに必要なのは「あのとき動いていた中身そのもの」で、これは言葉では戻せません。

残し方には3つあって、それぞれ守っているものが違います。今回作るのは右端です。

AI との会話 閉じれば消える 何も残らない ノート(Obsidian) なぜ そう直したか = 言葉で残る 読み返せる LAB 003 で作った コード(git) そのときの中身 = そっくり残る 1つずつ戻せる 戻せる この記事で作る ノートと git は競合しません。「なぜ」と「中身」で役割が違うので、両方あって初めて揃います。

図の見方:会話は流れて消え、ノートは言葉を残し、git は中身そのものを点として残します。

AI に書かせると、なぜ自力で戻せないのか

「バージョン管理はプロが使うもの」と思われがちですが、 AI に書かせる人こそ必要です。理由は性格の違いです。

自分で書いたとき 変更は小さい どこを触ったか覚えている → 壊れても、記憶をたどれば戻せる AI に書かせたとき 12ファイル 5ファイル 9ファイル 変更は大きい・速い 中身を自分で読んでいない → 記憶に何も無いので、記憶では戻せない だから「戻れる仕組み」を、壊れる前に外側に用意しておく必要があります。

① 変更が大きい

一度のお願いで10個以上のファイルが変わることがあります。どこが効いたのか、後から目で追えません。

② 速い

確かめる前に次の変更が乗ります。「どこまでは動いていたか」の境目が、すぐ分からなくなります。

③ 自分で書いていない

これが決定的です。自分の手で書いていないものは、記憶から復元できません。頼れるのは記録だけです。

つまり、AI に書かせるなら、壊れる前に「動いていた時点」を外側に残しておくのが前提になります。 git があるかないかで、壊れたあとに何ができるかがどう変わるのかを、次の図にまとめました。

✕ git が無いとき AI が一度に たくさん書き換える 動かなくなった 戻り先が無い 原因も分からず、 作り直すしかない ○ git があるとき 動いた時点で セーブポイントを作る その後に壊れても 記録が残っている git 動いていた時点へ そのまま戻れる 戻れるかどうかは、壊れてから決まるのではなく、壊れる前にセーブしたかどうかで決まります。

図の見方:上の段は git が無い状態です。AI がまとめて書き換えて壊れても、動いていた時点がどこにも残っていないので、戻れません。 下の段は git がある状態です。動いたと確かめるたびにセーブポイントを作っておけば、壊れても、その時点までそっくり戻せます。

WORDS

用語は3つだけ覚える

① git(ギット)

フォルダの中身をまるごとコピーして積み上げていく道具です (実際は変わった部分だけを覚える仕組みですが、使う側は「まるごと」のつもりで構いません)。 Mac に無料で入ります(入っているかどうかは STEP 2-1 で確かめます)。難しく言えば「バージョン管理システム」ですが、 この記事ではセーブポイントを作る道具としてだけ使います。

② コミット

そのセーブポイント1つのことです。「いまの状態を1枚コピーしておく」=「コミットする」。 ゲームのセーブと違うのは、上書きではなく積み上がるところで、 何個前にでも戻れます。

③ リポジトリ

セーブポイントを積んでいく対象のフォルダのことです。 「このフォルダを git で見張る」と宣言すると、そのフォルダがリポジトリになります。 GitHub とは別物です (GitHub は、リポジトリをインターネット上に置いて他の Mac とも共有できるようにする外部のサービスで、使うのは LAB 008(2台の Mac と iPhone の回)です)。

この記事では GitHub を使いません。 git は自分の Mac の中だけで完結する道具で、インターネットも、アカウントも、公開も要りません。 「他人に見られるのでは」という心配は、この記事の範囲では起きません。

01

STEP 1 — 目安 5分

置き場所を決める

前回作ったのは「ノートの置き場所」でした。今回はその手前に、 AI に作らせたものが溜まっていく場所を1つ決めます。 あちこちに散らばっていると、守りようがないからです。 名前は何でも構いませんが、この記事では ~/code とします (~ は自分のユーザーフォルダの意味です)。

作り方はこうです。Finder(Mac のファイルを見るアプリ)のサイドバーから自分のユーザーフォルダ(家のアイコン)を開き、 右クリック(または Control キーを押しながらクリック)→「新規フォルダ」を選び、 名前を code に変えてください。

~/code — 作ったものを置く場所 最初のアプリ 次のアプリ 練習用 メモの道具 … これから増える この枠ぜんぶを git が見張る 中のフォルダを何個増やしても、見張るのは1つのまま 別系統 Obsidian の Vault — ノート 作業記録.md 読書メモ.md 日記.md こちらは git に入れない iCloud などの同期にまかせる

ノートは git に入れません。 ノートは「今の最新版が読めればいい」もので、1行ごとの変更履歴は要りません。 逆にコードは「動いていた時点に戻れる」ことが命なので、扱いを分けます。 ——この2系統に分かれているという感覚が、LAB 008「2台の Mac と iPhone」でそのまま効いてきます。

✓ ここまでの確認: Finder に code という名前のフォルダが1つあり、 AI に作らせるものは今後そこに置く、と決まっている。まだ中身は空でも構いません。

02

STEP 2 — 目安 10分

git を始める

2-1. 入っているか確かめる

ここからはターミナル(文字で命令を打ち込むアプリ)で打ちます。 開き方は LAB 003 のとおりです。コード枠の「コピー」を押し、ターミナルの窓をクリックしてから ⌘ と V を同時に押して貼り付け、Enter キーで実行します。

git --version

git version 2.50.1 のように出れば入っています。 入っていない場合は「開発者ツールをインストールしますか」というダイアログが自動で出るので、 そのまま進めてください(数分かかります)。自分で探して入れる必要はありません。 終わったら、もう一度 git --version を打って、バージョンが出るのを確かめます。

2-2. 名前を一度だけ登録する

git はセーブポイントに「誰がコピーしたか」を書き込みます。最初の1回だけ設定が要ります。 この記事の範囲では外に出ないので、本名でなくて構いません。 (LAB 008 で GitHub に上げると、この名前・メールも一緒に外へ出ます。あとで書き換えても、 それより前のセーブポイントには古い方がそのまま残るので、迷ったら公開しても困らない呼び名にしておくと安心です。)

git config --global user.name "あなたの名前"
git config --global user.email "あなたのメール"
git config --global init.defaultBranch main

"あなたの名前" と "あなたのメール" はそのまま打つ文字ではなく例です。 クォートの中だけ、ご自分の好きな呼び名とメールアドレスに書き換えてください。 ターミナルの中では書き換えにくいので、いったんメモアプリに貼って書き換え、それをターミナルへ貼り直すと楽です。 --global は「この Mac の自分のアカウントで、どのフォルダでも共通で使う」という意味で、一度登録すれば次からは要りません。 3行目は「最初の枝の名前を main にする」という設定です。 設定しておかないと毎回おせっかいな警告が出るので、ここで先に済ませておきます。 「枝」(ブランチ)とは、同じフォルダの中で歴史を複数の系統に分けて育てる仕組みのことで、 たとえば「今まで通り動く版」と「試しに作っている版」を同時に持てるようにするものです。 この記事では枝を1本しか使わないので、 ここでは「最初の1本に付ける名前」とだけ覚えておけば十分です。

2-3. そのフォルダを見張らせる

ターミナルで cd(「このフォルダへ移動する」という命令)と半角スペースを打ってから、 STEP 1 のフォルダを Finder からターミナルの窓へドラッグ&ドロップして Enter。そのあと1行です。 git は「いま居るフォルダ」を対象にするので、先に移動しておく必要があります。

git init

Initialized empty Git repository と出れば成功です。 フォルダの中に .git という隠しフォルダができ、ここに歴史が積まれていきます。 見た目は何も変わりません。この時点ではまだ1枚もコピーしていません。

2-4. git が何を見ているかを知る

ここが最初の山場です。git には3つの置き場所—— ①作業フォルダ(いま触っている本物)・②ステージ(コピーする前の控え室)・③履歴(コピーが積み上がる場所) ——があり、これさえ分かれば残りは手順です。

① 作業フォルダ app.py(直した) メモ.txt(新しい) index.html(直した) いま触っている本物 git add 選ぶ ② ステージ app.py index.html メモ.txt は選ばなかった 「これをコピーします」の控え室 git commit コピー ③ 履歴 いまここ 積み上がって消えない 戻れるのはここに入った分だけ ②ステージがあるおかげで「直したもの全部」ではなく「コピーしたいものだけ」を選べます。 これが後で、うっかり公開を防ぐ仕掛けとして効いてきます(STEP 3・後編の STEP 5)。

いまの状態はこれで見られます。この先も、迷ったらまずこれを打ちます。

git status

✓ ここまでの確認: git status が英語の一覧を返す。 「まだ何もコピーしていません」「こんなファイルがあります」と言われている状態なら正常です。

03

STEP 3 — 目安 10分 / この記事の山場

先に「コピーしないもの」を決める

この STEP を、最初のコミットより先に置いているのには理由があります。 git は一度コピーしたものを消しません。それが長所であり、ここでは落とし穴になります。 パスワードの入ったファイルを1回でもコピーしてしまうと、あとでファイルを消しても 過去のセーブポイントの中には残り続けます。 つまり「あとで気をつける」が効かない場所です。

やることは .gitignore(ギットイグノア)という名前のファイルを1つ作るだけです。 ここに書いた名前のものは、git が最初から見えていないものとして扱います。

フォルダの中身 app.py index.html .env(鍵) data.json(家計) 設定(この Mac 用) __pycache__ .gitignore 門番 名前で振り分ける git に入れる 自分で書いた(書かせた)もの。戻せる価値があるもの git に入れない(4種類) ① 合言葉 パスワード・鍵・トークン ② 個人のデータ 家計・健康・日記 ③ 機体ごとの設定 その Mac だけの値 ④ 作り直せるもの 生成物・ログ・キャッシュ ①②は事故になる。③④は邪魔になるだけ 迷ったら 「これが世界中から 見えても平気か」 と考える

3-1. 作る

AI に頼むのがいちばん早いです。会話画面にそのまま貼れます。 Claude Code は起動したフォルダで作業するので、先に STEP 2-3 と同じ要領(cd のあとに code フォルダをドラッグ&ドロップ)で移動してから、claude と打って Enter を押し、AI との会話画面を開いてください (別のフォルダで起動すると、そこに .gitignore ができてしまいます)。

このフォルダに .gitignore を作って。
合言葉・個人のデータ・この Mac だけの設定・作り直せるもの を
git に入れない形にして、それぞれ何を除いたか理由もコメントで書いて。

出来上がりはこんな形です。1行に1つ、# で始まる行はコメント(メモ書き)です。 並んでいる名前はあくまで例で、実際には AI があなたのフォルダの中身を見て決めます。

# ===== ① 合言葉(絶対に入れない) =====
.env
*.key
*.pem

# ===== ② 個人のデータ(外に出したくない中身) =====
data.json

# ===== ③ この Mac だけの設定(混ざると事故る) =====
settings.local.json

# ===== ④ 作り直せるもの(歴史に残す意味がない) =====
__pycache__/
node_modules/
*.log
.DS_Store

記号の読み方です。* は「何でも」の意味で、*.key は「名前の終わりが .key のものすべて」になります。 ① の .env はパスワードやトークン(サービスに本人だと示す長い文字列)などを書いておく設定ファイル、*.key と *.pem は鍵ファイルの拡張子(名前の末尾)です。 ② の data.json と ③ の settings.local.json は、それぞれ「個人のデータ」「この Mac 用の設定」を入れておくファイルの例です。 __pycache__/(Python が自動で作る作業用フォルダ)・ node_modules/(Node.js の部品置き場)・.DS_Store(Finder が自動で作る表示設定のファイル)は、 どれも消えても作り直されるものです。なお名前が . で始まるファイルは Finder に表示されません (⌘ Shift . で表示できます)。

理由をコメントで書き残してください。 半年後の自分は「なぜこれを外したんだっけ」を必ず忘れます。理由が無いと、 後から良かれと思って外し直してしまうのが一番危ないパターンです。 1行で構いません。

3-2. 効いているか確かめる

git status は、Claude Code の会話画面の中では打てません(AI への依頼文として受け取られます)。 /exit で会話を終えるか、ターミナルを新しく開いて STEP 2-3 と同じ要領で code フォルダへ移動してから打ちます。 STEP 4 のコマンドも同じ場所で打ちます。

git status

一覧から、除いたはずのファイルが消えていれば成功です。 まだ見えているなら、名前が違うか、そのファイルが .gitignore より前に 1度でもコピーされています(後者の直し方は後編の「もうコピーしてしまっていたら」へ)。

✓ ここまでの確認: git status の一覧に、見られたくないファイルが1つも出てこない。 ここを通過してから、次で初めてコピーします。

04

STEP 4 — 目安 5分

最初のセーブポイントを作る

いよいよ1枚コピーします。選んでからコピーする、の2手です。 下の .gitignore app.py index.html は例です。 実際にはご自分のフォルダにあるファイルの名前に置き換えてください。 無いファイル名が1つでも混ざると、その行は全体が失敗して何もコピーされません(壊れはしないので、名前を直して打ち直せば大丈夫です)。 フォルダに .gitignore しか無いなら、1行目は git add .gitignore だけで構いません。

git add .gitignore app.py index.html   ← コピーしたいものを名前で並べる
git commit -m "最初の記録:アプリの土台ができたところ"

-m のあとがそのセーブポイントの名前です。 日本語で構いません。「何をしたか」だけでなく「なぜそうしたか」を一言足しておくと、 戻り先を探すときに効きます。 成功すると [main (root-commit) a1b2c3d] 最初の記録… のような行と files changed(何ファイル変わったか)が出ます。何も出ずにエラーになったら、下の「つまずき集」を見てください。

! 最初の記録 画面を作った 保存できるようにした 色をそろえた 壊れた 月曜火曜 水曜木曜 いま ここまで戻せる 点が細かいほど、戻り先を細かく選べます。「動いた」と思った瞬間がコピーどきです。 逆に、1日ぶんをまとめて1枚にすると「動いていた所まで」戻れず、丸一日ぶん捨てることになります。 目安:AI に何か頼んで、動くのを確かめたら1枚。

積み上がった分は、いつでも一覧で見られます。

git log --oneline

左に出ている a1b2c3d のような文字列が、その1枚の背番号です。 戻すときに使います。q キーで一覧を閉じられます。

✓ ここまでの確認: git log --oneline に、自分が付けた名前の行が1つ以上出る。 この時点で「戻れる」状態は完成しています。 残りは、続ける仕掛け(後編の STEP 5)と、実際の戻し方(後編の STEP 6)です。

NEXT

前編のまとめと、後編へ

STEP 4 まででいったん完成です。戻れる場所(最初のセーブポイント)ができました。 後編の STEP 5・6 は、使いながら覚えれば十分です。

  • まずは1週間、何か直して動いたら1枚コピーするだけを続ける
  • 「コピーしないもの」は、最初のコミットより先に決める

LAB 006

AI に記録させる・戻す

記録(コミット)を AI に任せる頼み方と、壊れたときに実際に戻す手順。 合言葉をうっかりコピーしてしまっていたときの片付け方も。 →