| name | git-rescue |
| description | git の混乱を収拾し、履歴を手術する。コミットの取り消し・書き換え、conflict の解消、reflog からの復旧、git bisect による退行の特定。 |
git の救出と履歴の手術
git の履歴は裁判記録ではなく、意図して書かれた物語。git に入ったものはほぼ
すべて元に戻せるので、大胆に、しかし慎重に作業する。
引数は、いま起きている混乱、または行いたい履歴の変更。
レシピ
- 直前のコミットを取り消す(変更は残す):
git reset --soft HEAD~1
- 直前のコミットから 1 ファイルだけ外す: reset で外し、必要なら
git rm --cached、--amend でコミットし直す
- 直近 N コミットをまとめて良いメッセージにする: soft reset して commit し直す
- conflict(merge / rebase / cherry-pick): 両側を読み、それぞれの変更の
意図 を汲んでから統合する。テストを走らせてから 決着させること。
uv run python tools/check.py を通さずに conflict を解消しない。
- 消えたコードを取り戻す:
git reflog、stash、他のブランチを探す。
- 「いつ壊れた?」:
git bisect。判定条件をスクリプトにして
(exit 0 = good、非 0 = bad)、good と bad のコミットを渡し、二分探索させる。
ホストテストは速いので bisect と相性が良い。実機ビルドを判定に使うと
1 ステップ 10 秒以上かかることを見込んでおく。
安全
- 破壊的な操作の前に
git status を見て、未コミットの作業を stash / commit する
(git stash -u)。
- 履歴の書き換えは、共有していないものか、force-push して安全と確認できたものだけ。
--force-with-lease を使い、素の --force は使わない。