Skip to content
Back to skills

Undo

ASecurity

Safely undo the most recent git commit(s) on a feature branch. TRIGGER when the user says "undo my last commit", "undo last N commits", "oops revert that commit", "undo the commit but keep my changes", "uncommit", "revert my last change", "take back that commit", "/nyann:undo". Trigger on "revert" only when the user clearly means undoing a local commit (not `git revert` on a published one — see DISAMBIGUATION). DISAMBIGUATION: if the user says "revert a commit that's already on main" / "rever...

  • 6 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 26, 2026
developmentgogit

Security analysis

A100/100

Scanned May 27, 2026

npx -y skills add thettwe/nyann --skill undo --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Undo?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Undo
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/thettwe-undo/badge)](https://www.skillsdirectory.com/skills/thettwe-undo)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: undo
description: >
  Safely undo the most recent git commit(s) on a feature branch.
  TRIGGER when the user says "undo my last commit", "undo last N
  commits", "oops revert that commit", "undo the commit but keep my
  changes", "uncommit", "revert my last change", "take back that
  commit", "/nyann:undo". Trigger on "revert" only when the user
  clearly means undoing a local commit (not `git revert` on a
  published one — see DISAMBIGUATION).
  DISAMBIGUATION: if the user says "revert a commit that's already
  on main" / "revert a pushed commit" / mentions a specific remote
  SHA, this is the `git revert` workflow — undo-skill refuses pushed
  commits by default. Explain the difference and either use
  --allow-pushed (risky) or direct them to `git revert <sha>`.
  Do NOT trigger on "undo the last edit" (that's editor-level) or
  "rollback the deploy" (that's infrastructure, out of scope).
  Do NOT trigger on main/master/develop — long-lived branches should
  never be history-rewritten; use `git revert` instead.
---

# undo

Wraps `bin/undo.sh`. History-mutating operation — treat as destructive.

## 1. Always preview first

Before any mutation, run `bin/undo.sh --dry-run` and show the user
which commits will be undone. The preview JSON lists them newest-
first with SHA and subject. Read it back and ask the user to
confirm — even for a single-commit undo.

Exception: the user's request explicitly included "don't ask" / "just
do it" AND `--count` is 1 AND `--strategy` is `soft` (the safest
default). For anything multi-commit or non-soft, always confirm.

## 2. Decide strategy

Default is `soft` (safest — all changes stay staged). When the user's
intent is unclear, **you MUST call the `AskUserQuestion` tool** (not
plain text):

```json
{
  "questions": [
    {
      "question": "How should the commit be undone?",
      "header": "Strategy",
      "multiSelect": false,
      "options": [
        { "label": "Soft (Recommended)", "description": "Undo commit, keep changes staged" },
        { "label": "Mixed", "description": "Undo commit, keep changes in working tree (unstaged)" },
        { "label": "Hard", "description": "Undo commit AND discard all changes permanently" }
      ]
    }
  ]
}
```

For `hard`, warn the user twice: the work is gone after hard reset.
Confirm before executing even after the picker selection.

## 3. Decide scope

- **`last-commit`** (default) — one commit.
- **`last-N-commits` with `--count <N>`** — multiple commits. Use
  when the user says "undo the last 3 commits" or similar.

`last-N-commits` is more dangerous because commits partway down the
stack are harder to recover. For N > 3, suggest using `git reflog`
+ targeted revert instead of a bulk reset.

## 4. Pre-flight safety (script enforces; relay messages)

| Refusal reason | What to tell the user |
|---|---|
| `long-lived branch` | "Can't undo on main/master/develop. Use `git revert <sha>` to create a reverting commit." |
| `merge commit` | "HEAD is a merge commit — undo with `git revert -m 1 <merge-sha>` manually." |
| `already on upstream` | "The commit is already pushed to `<upstream>`. Either `git revert` it (safe) or pass `--allow-pushed` to force-push after the reset (only if nobody else pulled)." |
| `detached HEAD` | "Detached HEAD — checkout a branch first." |
| `fewer than N commits` | "Branch only has M commits; can't undo N." |

## 5. Invoke

```
bin/undo.sh --target <cwd> \
  [--scope last-commit|last-N-commits] [--count N] \
  [--strategy soft|mixed|hard] [--allow-pushed] [--dry-run]
```

## 6. Post-undo report

On success, echo back:

- What was undone (subjects from `undone_commits`).
- The new HEAD SHA.
- Where the changes are now: staged (soft), in working tree (mixed),
  or gone (hard).
- For `soft`/`mixed`: suggest `git status` to see what's pending.
- For multi-commit undo: remind the user that `git reflog` can
  recover the discarded history if they change their mind soon.

## 7. Hand-off

- "Re-commit with a new message" → `commit` skill after undo.
- "Now push the rewrite" → if undo required force-push (pushed
  commit with `--allow-pushed`), they'll need `git push --force-with-lease`.
  Don't run this automatically; explain and let them decide.
- "Undo the undo" → `git reflog` + `git reset --hard <prior-sha>`.
  Handle this as a separate one-off; don't add reflog logic to the
  undo skill itself.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.