Skip to content
Development
Skill

/undo

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".

From plugin
nyann
741 skills41 commands3 hooks

Claude Code

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

SKILL.md

undo.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):

{
  "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.

Read more
@thettwe
Ships withnyann

ငြမ်း is Burmese for scaffolding. Nyann is the Claude Code plugin that picks expert git defaults for your stack — branching, working hooks (Husky / pre-commit.com / lefthook), commits, releases, CI, docs — then keeps the repo on those rails through every PR

Stars on GitHub

Momentum

stars in total
7
Star history of thettwe/nyann on GitHub, a chart by star-history.com

Other skills on nyann.

add-team-source

add-team-source

Register a git URL as a team-profile source so nyann can periodically sync and expose its profiles under a namespace. TRIGGER…

@thettwe@thettweInstall Skill
bootstrap-project

bootstrap-project

Bootstrap a fresh or existing repo with nyann. TRIGGER when the user says "set up this project", "initialize git workflow",…

@thettwe@thettweInstall Skill
check-prereqs

check-prereqs

Survey the machine and report which nyann features are usable right now. TRIGGER when the user says "is my machine ready for…

@thettwe@thettweInstall Skill
cleanup-branches

cleanup-branches

Prune local branches whose work is already merged into the base. TRIGGER when the user says "clean up branches", "delete merged…

@thettwe@thettweInstall Skill
commit

commit

Generate a Conventional Commits message from the staged diff and create the commit after user confirmation. TRIGGER when the user…

@thettwe@thettweInstall Skill
diagnose

diagnose

Bundle a redacted, support-grade snapshot of the current nyann state for inclusion in a bug report or support request. Combines…

@thettwe@thettweInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills13d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react4d252k
@facebook@facebookInstall Skill

Questions about undo.

Which coding agents can use undo?
undo installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.