{"record":{"id":"590c2b848bbac662","repo":"pcottle/learnGitBranching","slug":"git-error-reset-detached","errorCode":null,"errorMessage":"git-error-reset-detached","messagePattern":"git-error-reset-detached","errorType":"exception","errorClass":"GitError","httpStatus":null,"severity":"error","filePath":"src/js/git/commands.js","lineNumber":675,"sourceCode":"      var generalArgs = command.getGeneralArgs();\n\n      if (commandOptions['--soft']) {\n        throw new GitError({\n          msg: intl.str('git-error-staging')\n        });\n      }\n      if (commandOptions['--hard']) {\n        command.addWarning(\n          intl.str('git-warning-hard')\n        );\n        // don't absorb the arg off of --hard\n        generalArgs = generalArgs.concat(commandOptions['--hard']);\n      }\n\n      command.validateArgBounds(generalArgs, 1, 1);\n\n      if (engine.getDetachedHead()) {\n        throw new GitError({\n          msg: intl.str('git-error-reset-detached')\n        });\n      }\n\n      engine.reset(generalArgs[0]);\n    }\n  },\n\n  revert: {\n    regex: /^git +revert($|\\s)/,\n    description: 'Revert some existing commits',\n    execute: function(engine, command) {\n      var generalArgs = command.getGeneralArgs();\n\n      command.validateArgBounds(generalArgs, 1, Number.MAX_VALUE);\n      engine.revert(generalArgs);\n    }\n  },","sourceCodeStart":657,"sourceCodeEnd":693,"githubUrl":"https://github.com/pcottle/learnGitBranching/blob/5b09d0ff9678cad164f5a7488a279a44f90d7256/src/js/git/commands.js#L657-L693","documentation":"Thrown by `git reset` when HEAD is in a detached state. LearnGitBranching simulates git in-memory; since `git reset <target>` (especially with --hard) needs a branch to move, the app refuses when HEAD points directly at a commit.","triggerScenarios":"Running `git reset` (or `git reset --hard <ref>`) after checking out a commit or otherwise detaching HEAD; engine.getDetachedHead() returns true.","commonSituations":"User checks out a commit SHA in the visualization, then tries reset instead of checkout to move; also common after switch --detach demonstrations.","solutions":["Reattach HEAD first: `git checkout main` (or any branch), then rerun reset","Use `git checkout <ref>` to move a detached HEAD instead of reset","In scripting/tests, check engine.getDetachedHead() before issuing reset"],"exampleFix":"// before (detached HEAD)\ngit reset --hard c2\n// after\ngit checkout main\ngit reset --hard c2","handlingStrategy":"validation","validationCode":"if (!engine.getDetachedHead()) { engine.reset('main'); } else { engine.checkout('main'); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always reattach HEAD with checkout before scripted resets","Prefer checkout/switch to move detached HEADs","Assert !engine.getDetachedHead() in test setup before reset steps"],"tags":["git","detached-head","reset"],"backgroundTag":"git-detached-head","analyzedSha":"5b09d0ff9678cad164f5a7488a279a44f90d7256","analyzedAt":"2026-08-27T13:53:49.057Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}