SFL 安心自由ラボ

LAB 002 — GUIDE

AIが壊しても戻れるようにする

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

約40分

全部やる場合

6 STEP

手順の数

Mac 1台

2台目は次回

0円

追加の費用

この記事の道順

  1. はじめに — AI だから戻れない3つの理由
  2. 用語は3つだけ覚える
  3. STEP 1 — 置き場所を決める
  4. STEP 2 — git を始める
  5. STEP 3 — 先に「上げないもの」を決める
  6. STEP 4 — 最初のセーブポイントを作る
  7. STEP 5 — AI に記録させる
  8. STEP 6 — 戻す
  9. もう上げてしまっていたら
  10. つまずき集(症状から引く)
  11. よくある質問
  12. 次の一歩

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

INTRO

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

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

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

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

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

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

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

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

① 変更が大きい

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

② 速い

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

③ 自分で書いていない

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

WORDS

用語は3つだけ覚える

① git(ギット)

フォルダの中身をまるごとコピーして積み上げていく道具です。 Mac には最初から入っています。難しく言えば「バージョン管理システム」ですが、 この記事ではセーブポイントを作る道具としてだけ使います。

② コミット

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

③ リポジトリ

セーブポイントを積んでいく対象のフォルダのことです。 「このフォルダを git で見張る」と宣言すると、そのフォルダがリポジトリになります。 GitHub とは別物です(GitHub は次回)。

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

01

STEP 1 — 目安 5分

置き場所を決める

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

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

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

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

02

STEP 2 — 目安 10分

git を始める

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

git --version

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

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

git はセーブポイントに「誰がコピーしたか」を書き込みます。最初の1回だけ設定が要ります。 この記事の範囲では外に出ないので、本名でなくて構いません。

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

3行目は「最初の枝の名前を main にする」という設定です。 無くても動きますが、毎回おせっかいな警告が出るので消しておきます。

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

ターミナルで cd と半角スペースを打ってから、 STEP 1 のフォルダをドラッグ&ドロップして Enter。そのあと1行です。

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 に頼むのがいちばん早いです。会話画面にそのまま貼れます。

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

出来上がりはこんな形です。1行に1つ# で始まる行はコメントです。

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

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

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

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

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

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

git status

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

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

04

STEP 4 — 目安 5分

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

いよいよ1枚コピーします。選んでからコピーする、の2手です。

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

-m のあとがそのセーブポイントの名前です。 日本語で構いません。「何をしたか」だけでなく「なぜそうしたか」を一言足しておくと、 戻り先を探すときに効きます。

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

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

git log --oneline

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

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

05

STEP 5 — 目安 5分

AI に記録させる

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

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

git には「変わったもの全部を一気に選ぶ」便利な書き方があります(git add -A)。 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 に、この節を足します。そのまま使えます。

## 記録の残し方

- 何か直して、動くのを確かめたら、そこで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 背番号

いちばん実用的なのは、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 に足して、もう一度コピーする

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

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

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

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

TROUBLE

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

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

FAQ

よくある質問

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

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

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

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

Obsidian の Vault も git に入れた方がいいですか?

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

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

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

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

なりません。いま作った歴史は同じ Mac の中にあるので、Mac ごと壊れれば一緒に消えます。守れるのは「自分(と AI)が壊したとき」だけです。機械の故障に備える話は次回です。

NEXT

次の一歩

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

  • STEP 4 まででいったん完成。STEP 5・6 は使いながら覚えれば十分です
  • 合言葉をコピーしてしまった心当たりがあるなら、先に片付けておいてください
  • 次回 GitHub に上げると、片付け忘れたものも一緒に外へ出ます

LAB 003(準備中)

2台の Mac と iPhone で、同じものを持ち歩く

GitHub を足して、2台目の Mac から続きができるようにします。 この記事の冒頭に出した3つの残り方——会話・ノート・コード——が、 そこで「どれが自動で届き、どれが届かないか」に分かれます。 いちばん困るのは、届かないものに気づかないまま移動したときです。

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