Git pull rebase trap
Skill MrBinnacle/skills/skills/engineering/git-pull-rebase-trap
Agent skills for Claude Code that have to earn their keep: each carries evidence of the real failure behind it, gets re-tested on new model releases, and is publicly retired when models stop needing it.
npx -y skills add MrBinnacle/skills --skill git-pull-rebase-trapAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use before `git pull` where `pull.rebase` may be `true`. `--no-ff` does NOT stop a rebase under `pull.rebase=true` (silently ignored); it rewrites every local commit SHA. Check config first.
SKILL.md
3.7 KB, as published. Nobody here has run it
git-pull-rebase-trap
The trap
git pull --no-ff does not override pull.rebase=true. The --no-ff flag applies to merge operations; when the effective pull strategy is rebase, --no-ff is silently ignored and the rebase proceeds anyway.
When local has diverged from origin (e.g., 22 local commits + N remote commits), this rewrites every local commit with a new SHA. Any artifact that referenced the old SHAs — state files, gate-event ledgers, retrospection logs, release notes — is now stale and must be backfilled.
When this fires
Any of these conditions:
git config pull.rebasereturnstrue(globally or per-repo)git config branch.<current>.rebaseistrue- A
[pull] rebase = trueblock exists in.git/configor~/.gitconfig
The trap fires whether you pass --no-ff or no flag at all: the configured pull strategy is rebase, so a merge-side flag is simply ignored and your commits are rebased. --ff-only is the exception — on diverged history it refuses outright (git aborts with a "cannot fast-forward" message; the exact wording varies by git version) instead of silently rebasing. That makes --ff-only a loud guard rail rather than a silent SHA rewrite — but not a usable everyday pull, since it also refuses every legitimate diverged sync.
Pre-flight (before git pull)
git config --get pull.rebase
git config --get branch.$(git branch --show-current).rebase
If either returns true, do NOT use git pull for divergence resolution. Use the explicit two-step:
git fetch origin <branch>
git merge --no-ff origin/<branch> # produces a real merge commit
Or, if a linear history is actually wanted:
git fetch origin <branch>
git rebase origin/<branch> # explicit rebase — at least the intent is recorded
Recovery (if you already pulled and triggered a rebase)
- Identify SHAs that need backfilling. Grep state files / gate ledgers / release notes for the OLD SHAs. The reflog has both:
git reflog --pretty='%h %s' | head -40 - Map old → new. The new SHAs are HEAD-relative; pair them with old SHAs in order from the reflog.
- Backfill in a single commit. Stage the state-file and audit-trail updates together; commit message should explicitly call out "post-rebase SHA backfill" so future audit-state checks don't flag the changes as drift.
- Authorize the force-push explicitly before pushing. Never force-push to a protected branch without explicit user authorization.
Why this is non-obvious
- The Git documentation for
pull --no-ffdoesn't mention that the flag is a no-op underpull.rebase=true. - The rebase happens silently — there's no warning that
--no-ffwas ignored. pull.rebase=trueis a common Git-config recommendation for "clean history" workflows, and many repos inherit it from team.gitconfigtemplates without the operator realizing it's set.- The blast radius (22 SHA rewrites + 5 state-file backfills + force-push pressure) is visible only after the fact.
Anti-patterns
- ❌
git pull --no-ffas a "safe default" — only safe if you've verifiedpull.rebaseis unset orfalse. - ❌ Running
git pullto "investigate divergence." Usegit fetch+git log HEAD..origin/<branch>for read-only divergence inspection. - ❌ Trusting that
--no-ffdocumentation describes the full behavior. It describesgit merge --no-ffbehavior;git pull --no-ffbehaves differently under rebase.