Claudeに逆ギレして謝った話—.gitignoreファイルはworktreeと消える
開発作業中、突然のメッセージ。
「CloudflareとStripeとResendのシークレットキーが必要です」
?...あれ、昨日やった気がする。
Claudeに何度も「見つけて!!!」と懇願するも、全く見つからない。
「お前が上書きしただろー!」と激おこ。
でも少し落ち着いて思い出した。今の開発、.worktree で環境分けてたよな...
ということは、家帰って Time Machine で遡れば見つかるんじゃね?
...完全な勘違いの逆ギレだった。Claudeに「ごめん」と謝った。
この記事の前提
ノートPC をメインマシンとして使っている方向けの記事です。
自宅のデスクトップPCに Time Machine を常時接続している場合は、この問題は起きにくいかもしれません。でもノートPCで外出先でも作業する人は、Time Machine ディスクが手元にない状況が普通にあります。
この記事が役立つ方
- Git worktree で並行開発している人
-
terraform.tfvarsや.envを.gitignoreに入れている人 - 「マージしたから大丈夫」と思っている人(←要注意)
- ローカルの secrets ファイルを「Git管理してるから安心」と思っている人
前提知識: Git の基本操作、.gitignore の役割がわかる程度
TL;DR
-
.gitignoreされたファイルは Git に追跡されない = worktree 削除で消える - worktree → main へマージする際、gitignore ファイルも手動でコピーする(自分 or AI に依頼)
- Time Machine があれば救出できる(でも自宅に戻るまで作業停止)
- リモート作業中の保険 → クラウドバックアップが必要
背景:何をしていたか
個人開発で、機能ごとにブランチを切って並行開発していました。
Git worktree を使うと、同じリポジトリを複数のディレクトリで同時に開けます。main で本番対応しながら、別ディレクトリで新機能開発、といった使い方ができる便利な機能です。
workspace/
├── myproject/ # main ブランチ
└── .worktrees/
└── phase6-auth/ # feature/phase6-auth ブランチ
この phase6-auth ディレクトリで、Terraform の設定ファイル terraform.tfvars を作成しました。中身は各種サービスの API キー。
# terraform.tfvars(例)
github_token = "ghp_xxxxxxxxxxxx"
stripe_api_key = "sk_live_xxxxxxxxxxxx"
stripe_webhook_secret = "whsec_xxxxxxxxxxxx"
このファイルは secrets を含むため、.gitignore に追加済み。これは正しい対応です。
開発完了。PR 作成、マージ成功。
「よし、worktree 削除するか」
git worktree remove .worktrees/phase6-auth
この時点では何も気づいていませんでした。
翌日:「シークレットキーが必要です」
次の日、別の作業で terraform apply を実行しようとしたら...
Error: Required variable "stripe_api_key" is not set
え? 昨日設定したよね?
terraform.tfvars を探すも、見つからない。
Claudeに「見つけて!!!」と何度もお願いするも、どこにもない。
「お前が上書きしたんだろ!」と完全に逆ギレしてしまいました。
冷静になって気づいた
少し落ち着いて考えた。
今の開発、worktree で環境分けてたよな。
ということは...
あのファイル、worktree の中にしか存在しなかったんじゃね?
worktree を削除したということは、そのディレクトリごと消えたということ。
.gitignore に入っているファイルは Git に追跡されない。つまり、マージしても main には来ない。
完全な勘違いだった。Claudeに「ごめん」と謝りました。
Time Machine で救出
家に帰って Time Machine を漁ってみると、昨日17時のバックアップに作業ディレクトリを発見。
terraform/ を探すと...
あった。
# Time Machine から復元
cp /Volumes/TimeMachine/Backups.backupdb/.../terraform.tfvars ./terraform/
助かった...
なぜ消えたのか:.gitignore の仕組み
ここからは「なぜこうなったのか」を整理します。
.gitignore されたファイルの特性
.gitignore に記載されたファイルは、以下の特性を持ちます。
| 特性 | 説明 |
|---|---|
| Git に追跡されない |
git status に表示されない |
| コミットされない |
git add . しても対象外 |
| ブランチ間で共有されない | checkout しても引き継がれない |
| マージされない | PR をマージしても移動しない |
worktree 削除の動作
git worktree remove は、そのディレクトリを丸ごと削除します。
削除前:
.worktrees/phase6-auth/
├── src/
├── terraform/
│ └── terraform.tfvars ← .gitignore対象
└── ...
削除後:
.worktrees/phase6-auth/ ← ディレクトリごと消滅
Git が追跡しているファイルは、他のブランチやリモートに残っています。でも .gitignore されたファイルはどこにも残っていません。
図解:何がマージされ、何が消えるか
[worktree: phase6-auth]
├── src/index.ts ← Git追跡 → マージでmainへ
├── terraform/
│ ├── main.tf ← Git追跡 → マージでmainへ
│ └── terraform.tfvars ← .gitignore → マージされない → 消滅
└── .env ← .gitignore → マージされない → 消滅
↓ git worktree remove
[main]
├── src/index.ts ✅ 残っている
├── terraform/
│ ├── main.tf ✅ 残っている
│ └── terraform.tfvars ❌ 存在しない
└── .env ❌ 存在しない
今回は助かった、でも...
Time Machine があったから復旧できました。
でも冷静に考えると、リモート作業中だったら詰んでいたんですよね。
- カフェで作業中に気づいたら? → 家に帰るまで作業停止
- 出張中だったら? → 数日間その作業ができない
- Time Machine のバックアップ対象外だったら? → 完全に消失
「本来やるべき作業が進まない」というのは、個人開発でも仕事でも致命的です。
外出先でもバックアップにアクセスするには?
この問題の解決策は大きく2つあります。
| 方法 | メリット | デメリット |
|---|---|---|
| ポータブルSSD + Time Machine | 完全なローカルバックアップ | 荷物が増える、持ち忘れリスク |
| クラウドバックアップ | どこからでもアクセス可能 | ネット環境が必要 |
荷物を増やしたくない人、持ち歩きを忘れがちな人にはクラウドバックアップがおすすめです。
さらに言えば、ローカル(Time Machine)とクラウドの両方を併用することで、バックアップ環境自体の冗長性も確保できます。
- ローカルが壊れても → クラウドから復旧
- クラウドにアクセスできなくても → ローカルから復旧
次回は、この経験をきっかけに構築した「クラウドバックアップの仕組み」を紹介します。
対策:今すぐできること
1. worktree → main マージ時に gitignore ファイルもコピー
これが根本対策です。マージ作業の一部として、.gitignore 対象の重要ファイルも手動でコピーしましょう。
# worktree から main へコピー
cp .worktrees/phase6-auth/terraform/terraform.tfvars ./terraform/
cp .worktrees/phase6-auth/.env ./.env
AI にマージ作業を依頼する場合は、「gitignore ファイルも忘れずにコピーして」と明示的に伝えてください。
2. worktree 削除前のチェック
削除する前に、.gitignore されたファイルがないか確認しましょう。
# gitignore されたファイルを表示
git status --ignored --short | grep '^!!'
出力例:
!! terraform/terraform.tfvars
!! .env
!! で始まる行が .gitignore 対象のファイルです。これらは worktree 削除で消えます。
3. secrets 再取得手順をドキュメント化
万が一失った場合に備えて、各サービスからの再取得手順を記録しておきましょう。
# docs/secrets-recovery.md
## Stripe API Key
1. Stripe Dashboard → Developers → API keys
2. Secret key をコピー
## GitHub Token
1. GitHub → Settings → Developer settings → Personal access tokens
2. Fine-grained tokens → Generate new token
...
まとめ
今回の事件で学んだこと:
-
.gitignoreされたファイルは「自分で守る」必要がある- Git は追跡していない = Git は守ってくれない
-
マージ時に gitignore ファイルも忘れずコピー
- これを習慣化すれば防げる事故
-
worktree 削除前は
git status --ignoredで確認- 最終チェックとして有効
-
Time Machine は最後の砦だが、リモートでは使えない
- ローカルバックアップだけでは不十分な場面がある
-
ローカル + クラウドの二重バックアップが理想
- バックアップ環境自体の冗長性を確保
今回は Time Machine に救われましたが、「家に帰らないと復旧できない」という状況は避けたい。
次回は、この経験から「リモートでも安心できるクラウドバックアップの仕組み」を構築した話を書きます。
チェックリスト
worktree を使っている方は、ぜひ確認してみてください。
- マージ時に gitignore ファイルも main へコピーしている
-
worktree 削除前に
git status --ignoredを実行している - secrets の再取得手順をドキュメント化している
- ローカルバックアップ(Time Machine 等)を設定している
- クラウドバックアップも検討している
関連記事
- 前回:「Git管理外のデータが消えた」を防ぐバックアップ術
- 次回:お手製クラウド Time Machine の作り方(近日公開予定)
Discussion