
JJ保険に救われた話 – Copilot時代のローカル変更バックアップ
こんにちは、エーピーコミュニケーションズ ACS事業部の福井です。
最近は GitHub Copilot CLI を使った開発スタイルを本格的に試しています。
プロンプト一発で広範囲をガッと書き換えられるあの感覚、クセになりますよね。
そんなある日、Copilot CLI で複数ファイルをまたいだ機能変更を一気に進めていたときのこと。
一段落したのでブランチを切り替えてリフレッシュしたら……あれ? あのファイルがない。
ローカルにしか置いていなかった下書き用の 309.md が、きれいさっぱり消えていました。
「やったな、これ……」
コミットし忘れ + ローカルでのリフレッシュという最悪コンボ。
PRを出してドヤるはずが、「最初から書き直し確定」という地獄モードに突入しかけたところで、
私を救ってくれたのが JJ(Jujutsu)保険 でした。
→ jujutsu(名前は呪術じゃなくて柔術らしいです)
1. Copilot CLI の「便利さと落とし穴」
Copilot CLI は、とにかくテンポがいいです。
- 方針をざっと日本語で投げる
- まとめて生成・リファクタしてもらう
- 気に入らなければもう一回投げる
このサイクルを高速で回せるのは、本当に気持ちいい。
一方で、こんな落とし穴があります。
- Working copy only の脆さ
実験的な下書きファイルやメモ的な.mdは、コミットせずにローカルだけで転がしておきがち。 - 高速な破壊
AI に任せた大胆なリファクタや削除のついでに、Git 管理外のファイルがしれっと消える。
Git の管理下に乗っていないものは、消えた瞬間ほぼゲームオーバーです。
「.git には一度も載せてないんだよな……」となると、普通の Git 運用では復旧のしようがありません。
2. JJ(Jujutsu)が登場:「ローカルファイル保険」
そこで出てくるのが、Git と共存できる新しめの VCS、JJ (Jujutsu) です。
JJ をひとことで言うと、「ローカルの作業状態ごと履歴にしてしまう Git 互換 VCS」です。
なぜ JJ が「保険」になるのか
JJ の特徴を、今回のような事故目線で整理するとこんな感じです。
- 自動スナップショット
jj stやjj logなどのコマンドを打つたびに、ワーキングツリーのスナップショットが裏で記録される。 - 「未コミット」がない世界観
JJ では、作業中の状態も常にひとつのリビジョンとして扱われるため、「コミットしてないから履歴に残ってない」という状況が減る。 - 軽量運用
テキスト中心のプロジェクトなら、.jj/ディレクトリは数百KB〜数MB程度に収まることが多く、常時オンでも現実的。
つまり、「Git ではまだコミットしていないローカル編集」も、JJ 目線ではちゃんと履歴に残っている という状態を作れるわけです。
3. 実録:消えた「309.md」を JJ で救出した流れ
実際に 309.md を復旧したときの流れを、そのまま残しておきます。
① ファイル名を含む履歴をざっくりあさる
まずは、「過去一度でも 309.md に触れたリビジョンはなかったか?」を JJ のログからあさります。
# 全履歴から特定のファイル名が含まれるリビジョンを探す jj log -r 'all()' --summary | grep -B 20 "309.md"
ここで、309.md が存在していたときのリビジョンID(例:mmzltltr)を特定します。
② 別ディレクトリにまとめて復元する
リビジョンがわかったら、その時点に存在していたファイルをまるごと別ディレクトリに書き出していきます。
mkdir -p ~/recovery_dir
jj files -r mmzltltr | xargs -I {} sh -c \
"mkdir -p ~/recovery_dir/\$(dirname {}); jj print -r mmzltltr {} > ~/recovery_dir/{}"
これで、~/recovery_dir 以下にその時点のファイル群が復元されます。
あとは 309.md を拾ってきて、元のリポジトリに戻すだけです。
「コミットしてない下書きまで全部履歴に残ってた」という、このちょっとした感動が JJ 保険の正体です。
4. Copilot CLI × JJ のワークフロー
Copilot で思考と手を加速させつつ、JJ で「万が一」を吸収する。
自分の中では、最近こんな役割分担に落ち着きつつあります。
| 作業段階 | 使うツール | 役割・意図 |
|---|---|---|
| 方針相談・たたき台生成 | Copilot CLI | 構成案や下書きコードを高速生成 |
| ガッと大量編集するフェーズ | Copilot CLI | ファイルまたぎの修正やリファクタを一気に適用 |
| その裏での保険 | JJ | jj st などのタイミングでローカルスナップショットを自動保存 |
| 「やりすぎた」時の巻き戻し | JJ | さっきの状態からファイル単位で復旧 |
| 仕上げて共有するフェーズ | Git (via JJ) | きれいに整理した履歴だけをチームの共通履歴に反映 |
Copilot の「破壊力」と JJ の「記録力」をセットで使うことで、 「とりあえずやってみるか」を躊躇なく押せる のが大きいと感じています。
5. JJ を Copilot の Skill にする未来
ここまで来ると、JJ による復旧手順も毎回手で打つのではなく、Copilot 側に寄せたくなってきます。
イメージとしては、Copilot CLI の Agent Skill として JJ をラップしておき、こう呼べる世界です。
# Copilot CLI の Skill に登録する(概念図)
copilot skill add jj_recovery \
--description "Lost local file recovery from Jujutsu snapshots" \
--command "./scripts/jj_recover.sh \"{query}\""
例えば、ファイル名を渡すと内部でさきほどの jj log / jj print を叩いてくれる jj_recover.sh を用意しておきます。
- 「
copilot jj_recover "309.md"」 - → Copilot が Skill の説明を見て、JJ の履歴から
309.mdを探し、復元まで実行してくれる
こんな「やらかしたときの駆け込み寺スラコマンド」があると、 ローカル実験の心理的コストがさらに下がっていきます。
6. 運用時に気をつけたいこと
最後に、JJ を「保険」として雑にオンにしておくときの注意ポイントです。
- 容量の見積もり
テキスト中心なら軽いですが、動画・巨大バイナリが混ざると.jj/のサイズは普通に育ちます。 - 除外ルールの整理
ビルド成果物や大きめの生成物は JJ 側でも無視するように設定しておくのが無難です。 - 定期的なお掃除
使い続けるなら、たまにjj util gcで古いログを整理してあげると安心です。
おわりに:JJ 保険、入っとく?
あのとき絶望してターミナルを見つめていた自分に、一言だけ伝えるなら。
「JJ 保険、入っとけ」
Copilot で「思考と手」をブーストしつつ、JJ で「ローカルの過去」を静かに守る。
そんな組み合わせを一度仕込んでおくと、「とりあえず書いてみるか」という一歩目がかなり軽くなります。
もし同じように、Copilot CLI を使った爆速開発の裏で「未コミット地獄」にヒヤッとしたことがある方は、ぜひ JJ 保険も一度試してみてください。
JJ のコマンドや概念の詳細については、公式のドキュメントがとても丁寧なので、導入時に一度目を通しておくと安心です。
- JJ 公式ドキュメント: https://jj-vcs.github.io/jj/
- GitHub リポジトリ: https://github.com/jj-vcs/jj
ACS 事業部のご紹介
私の所属する ACS 事業部では、開発者ポータル Backstage、Azure AI Service などを活用し、Platform Engineering + AI の推進・内製化を支援しています。
www.ap-com.co.jp www.ap-com.co.jp www.ap-com.co.jp
また、GitHub パートナーとしてお客様に GitHub ソリューションの導入支援を行っています。
GitHub Copilot などのトレーニングなども行っておりますので、ご興味を持っていただけましたらぜひお声がけいただけますと幸いです。
一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。 ※求人名の冒頭に【ACSD】と入っている求人が当事業部の求人です。
https://www.ap-com.co.jp/acs-cluturedeck/?utm_source=acsd&utm_medium=blogwww.ap-com.co.jp www.ap-com.co.jp