semantic-release keeps trying to reuse deleted immutable tag

Author: 0-SandyCreated May 1, 2026Updated Aug 21, 2026

I accidentally published v0.6.0-beta.1 in my repository while using semantic-release.

The problem: I had GitHub immutable releases enabled, this prevents that version tag from ever being used again.

The issue is that semantic-release keeps trying to publish v0.6.0-beta.1 instead of advancing the next version.

When I run the pipeline, it always fails with:

[4:49:00 PM] [semantic-release] [@semantic-release/commit-analyzer] › ℹ  The release type for the commit is minor
[4:49:00 PM] [semantic-release] [@semantic-release/commit-analyzer] › ℹ  Analysis of 5 commits complete: minor release
[4:49:00 PM] [semantic-release] › ✔  Completed step "analyzeCommits" of plugin "@semantic-release/commit-analyzer"
[4:49:00 PM] [semantic-release] › ℹ  The next release version is 0.6.0-beta.1
[4:49:00 PM] [semantic-release] › ℹ  Start step "generateNotes" of plugin "@semantic-release/release-notes-generator"
[4:49:00 PM] [semantic-release] › ✔  Completed step "generateNotes" of plugin "@semantic-release/release-notes-generator"
[4:49:00 PM] [semantic-release] › ℹ  Start step "prepare" of plugin "@semantic-release/npm"
[4:49:00 PM] [semantic-release] [@semantic-release/npm] › ℹ  Write version 0.6.0-beta.1 to package.json in /home/runner/work/better-invite/better-invite/package
v0.6.0-beta.1
[4:49:01 PM] [semantic-release] › ✔  Completed step "prepare" of plugin "@semantic-release/npm"
[4:49:01 PM] [semantic-release] › ✘  An error occurred while running semantic-release: ExecaError: Command failed with exit code 128: git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273

fatal: tag 'v0.6.0-beta.1' already exists
    at getFinalError (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/return/final-error.js:6:9)
    at makeError (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/return/result.js:108:16)
    at getAsyncResult (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/methods/main-async.js:168:4)
    at handlePromise (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/methods/main-async.js:151:17)
    at async tag (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/lib/git.js:224:3)
    at async run (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/index.js:208:5)
    at async Module.default (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/index.js:278:22)
    at async default (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/cli.js:55:5) {
  shortMessage: 'Command failed with exit code 128: git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273',
  command: 'git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273',
  escapedCommand: 'git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273',
  cwd: '/home/runner/work/better-invite/better-invite/package',
  durationMs: 5.071485,
  failed: true,
  timedOut: false,
  isCanceled: false,
  isGracefullyCanceled: false,
  isTerminated: false,
  isMaxBuffer: false,
  isForcefullyTerminated: false,
  exitCode: 128,
  stdout: '',
  stderr: "fatal: tag 'v0.6.0-beta.1' already exists",
  stdio: [ undefined, '', "fatal: tag 'v0.6.0-beta.1' already exists" ],
  ipcOutput: [],
  pipedFrom: []
}
ExecaError: Command failed with exit code 128: git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273

fatal: tag 'v0.6.0-beta.1' already exists
    at getFinalError (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/return/final-error.js:6:9)
    at makeError (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/return/result.js:108:16)
    at getAsyncResult (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/methods/main-async.js:168:4)
    at handlePromise (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/execa/lib/methods/main-async.js:151:17)
    at async tag (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/lib/git.js:224:3)
    at async run (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/index.js:208:5)
    at async Module.default (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/index.js:278:22)
    at async default (file:///home/runner/.cache/pnpm/dlx/06dc774b296759f21c0d70fd931569643f0e5e9e4aba358fb0d72a707a106f87/19de4717b5d-9f2/node_modules/.pnpm/[email protected]/node_modules/semantic-release/cli.js:55:5) {
  shortMessage: 'Command failed with exit code 128: git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273',
  command: 'git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273',
  escapedCommand: 'git tag v0.6.0-beta.1 eb786c2108b35a1ed92cf1e59e3ecf2ec1251273',
  cwd: '/home/runner/work/better-invite/better-invite/package',
  durationMs: 5.071485,
  failed: true,
  timedOut: false,
  isCanceled: false,
  isGracefullyCanceled: false,
  isTerminated: false,
  isMaxBuffer: false,
  isForcefullyTerminated: false,
  exitCode: 128,
  stdout: '',
  stderr: "fatal: tag 'v0.6.0-beta.1' already exists",
  stdio: [ undefined, '', "fatal: tag 'v0.6.0-beta.1' already exists" ],
  ipcOutput: [],
  pipedFrom: []
}

The issue is specifically that semantic-release keeps selecting the already-used prerelease version instead of incrementing it.

What I tried

  • Deleted the tag locally and remotely
  • Removed the GitHub release
  • Manually create v0.6.0-beta.2
  • Re-ran semantic-release multiple times

No matter what, semantic-release continues resolving to v0.6.0-beta.1.

Question

How can I make semantic-release ignore the already-published prerelease version and correctly continue the prerelease sequence (e.g. move to beta.2 or beta.3)?

Is there a way to reset or recompute the latest prerelease state so it doesn’t reuse an already published version?

Source: semantic-release/semantic-release