上書きしてもコミットは残っています
ブランチはただのポインタです
ブランチは 1 つのコミットに付いたラベルで、「ここが先頭」と指しているだけです。
force push はコミットを消しません。ラベルを動かしただけです。元のコミットは残っていて、住所を見失っただけです。
そして GitHub は、プッシュのたびにその住所を記録しています。
before: 7f3a91c <- 見失った住所
head: 9d2b04e復元も同じ仕組みです。ブランチをそのコミットに指し直すだけです。
スキャンの流れ
- 01
期間内のプッシュを集めます
イベントで対象を絞るので、組織全体を総当たりしません。
- 02
直前のツリーと今のツリーを diff します
どのファイルが追加、変更、削除されたかが出ます。
- 03
変わったファイルを全部残します
ここが成果物です。ルールと関係なく残ります。
- 04
先に読むものを並べ替えます
判定ではなく順番です。
- 05
あとは人か AI が引き取ります
この道具はこの手前で止まります。
同じ事実が限界にもなります
GitHub Events APIは 90 日、300 件ほどしか残りません。それを過ぎると住所が見つかりません。
だから早く見る必要があり、道具も画面でそう伝えます。掘った記録をファイルに残すのも同じ理由です。

先に読むものの決め方
4 つとも実際の事故から出てきたものです。どれにも当たらないから安全、という意味ではありません。
サイズの急増
設定ファイルの後ろに空白を長く入れて、その先にコードを隠す手口があります。名前はそのままなので目につきませんが、サイズは正直に増えます。
リポジトリをまたぐ同じファイル
ツールで複数のリポジトリを書き換えると、まったく同じ中身があちこちに入ります。内容のハッシュが同じなら同じファイルです。
author の偽装
author の名前と日付は変えられます。ですが committer の日付は実際に作られた時刻なので、ずれた跡が残ります。
ツールの痕跡
自動化ツールは作業用の一時ファイルを作り、コミットに混ざらないよう .gitignore に書き足します。その行がそのまま指紋です。