Git undo
Skill KhaledSaeed18/dotclaude/.claude-plugin/plugins/git/skills/git-undo
Reusable Claude Code extension registry. skills, subagents, slash commands, and hooks for engineering, git, testing, and security workflows. Distributed as a shadcn GitHub registry and as installable plugins.
npx -y skills add KhaledSaeed18/dotclaude --skill git-undoAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 4 stars4 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
Recover safely from Git mistakes such as discard, unstage, amend, reset, revert, restore lost commits via reflog, recover deleted branches, and fix bad rebases. Chooses the least-destructive fix and protects against data loss. Use when something in Git went wrong and needs undoing.
SKILL.md
4.9 KB, as published. Nobody here has run it
Undo the mistake with the least-destructive tool that fits, after establishing two facts that change everything: has the work been committed, and has it been pushed/shared. Get those wrong and you either lose work or rewrite history other people depend on.
Hard rules: never break these
- Diagnose before acting. Establish: committed or not? pushed or not? on a shared branch? Run
git status,git log --oneline -10, andgit reflog -20first. The fix depends entirely on the answers. - Never rewrite published history casually. For anything already pushed to a shared branch, undo forward with
git revert; do notreset/rebase/commit --amendand force-push unless the user explicitly owns the consequences and coordinates with collaborators. - Take a safety net before any destructive op. Before
reset --hard, a force-push, or a history rewrite, snapshot the current tip:git branch backup/<desc>orgit tag backup/<desc>. Reflog usually saves you, but a branch is free insurance. --hardandcleandestroy uncommitted work irrecoverably. Reflog only recovers committed states. Spell out exactly what will be lost and confirm before running them.- Confirm before any destructive or shared-history command:
reset --hard,clean -fd,push --force*, history rewrites. Preferpush --force-with-leaseover--forcewhen a rewrite is genuinely required.
Step 1: Diagnose
git status: staged vs unstaged vs untracked; any operation in progress.git log --oneline --graph -15: recent commits and branch shape.git reflog -25: the time machine, every positionHEADhas held, even "lost" ones. This is how you recover almost anything committed.- Determine shared or local: has the affected commit/branch been pushed?
git status(ahead/behind),git branch -r --contains <sha>.
Step 2: Pick the fix
Match the situation to the safest tool:
Uncommitted work
- Discard changes in a file →
git restore <file>(wasgit checkout -- <file>). - Unstage but keep changes →
git restore --staged <file>(wasgit reset HEAD <file>). - Set aside without losing →
git stash push -m "<note>"; bring back withgit stash pop. - Remove untracked files →
git clean -nd(dry run first!), thengit clean -fdonce confirmed.
The last commit (not yet pushed)
- Wrong message →
git commit --amend. - Forgot a file → stage it, then
git commit --amend --no-edit. - Undo the commit, keep changes staged →
git reset --soft HEAD~1. - Undo the commit, keep changes unstaged →
git reset --mixed HEAD~1(default). - Undo the commit and discard changes →
git reset --hard HEAD~1(destructive; safety net first).
Already pushed / shared branch
- Undo a commit safely →
git revert <sha>(creates an inverse commit; history stays intact). Revert a merge with-m 1.
Wrong-branch / structural mistakes
- Committed to the wrong branch → create the right branch from here (
git branch feature), thengit reset --hard origin/<wrong-branch>on the original (safety net first); orgit cherry-pickthe commits onto the right branch and drop them from the wrong one. - Need an old version of one file →
git restore --source=<sha> -- <file>.
Recovering things that look lost
- Hard reset / branch deletion / bad amend → find the old SHA in
git reflog, thengit branch recovered <sha>orgit reset --hard <sha>. - Botched rebase/merge →
git reset --hard ORIG_HEADreturns to the pre-operation tip. - Deleted branch with no reflog entry →
git fsck --lost-foundlists dangling commits. - Dropped a stash →
git fsck --no-reflog | grep commit, or recover fromgit reflog stash.
Step 3: Safety net (before anything destructive)
Snapshot the current tip so the operation is reversible regardless of outcome:
git branch backup/before-undo # or: git tag backup/before-undo
Note the current HEAD SHA too. This costs nothing and turns "irreversible" into "recoverable."
Step 4: Execute (with confirmation)
- State plainly: what command runs, what it changes, and what (if anything) is lost forever.
- For destructive or shared-history operations, get an explicit yes. For force-pushes, use
--force-with-leaseand confirm no one else's work is being overwritten. - Run it.
Step 5: Verify
git statusandgit log --oneline -5to confirm the tree and history are what you intended.- Confirm recovered work is present (file contents, expected commits).
- Note the safety branch/tag you created; remove it once the user confirms the recovery is good.