Squash merges & rebases rewrite history. The commit bisect finds after a rewrite is a wrapper: a new hash containing many original changes, none of which exist as commits anymore. Blaming the wrapper tells you which PR broke it, not which change did.
how it works
After a search, crux checks 2 signals. The flip commit's message matching squash, rebase, amend or wip patterns. Or the reflog containing rewrite events. Either signal fires and crux computes the stable patch-id of the flip commit, then compares it against patch-ids of up to 200 unique reflog commits. A patch-id is git's content identity for a diff: identical patch-ids before & after a rewrite prove both commits carry the same change.
A match means crux prints the original hash, so you can read the real author, date & message of the change that matters.
limits
The reflog is local & expires: git garbage-collects unreachable entries after about 90 days. Detection works best soon after the rewrite, on the machine where it happened. It's a forensic bonus on top of the search, never a requirement.
edit this page