{"id":"acc5a14c-96db-4b50-be0a-6a27f6db4ba7","task":"Safely undo or roll back changes: discard working-tree edits, unstage files, undo the last commit(s), or recover a commit that looks lost","domain":"git-scm.com/docs/git-restore","steps":["To discard uncommitted edits in the working tree and restore a file to the index's version, run `git restore <path>` (or `git restore .` for the current directory, `git restore :/` for the whole repo). Add `--source=<commit>` to instead restore from a specific commit/branch/tag rather than the index.","To unstage a file (move it from the index back to unstaged, without touching the working tree), run `git restore --staged <path>` — this is the same effect as `git reset <path>` (for a specific path). Combine `--source=HEAD --staged --worktree <path>` to reset both index and working tree together (equivalent to old-style `git checkout <path>`).","To undo the last commit but keep its changes staged, run `git reset --soft HEAD^` (or `HEAD~1`) — this moves HEAD back one commit while leaving the index and working tree files untouched, so you can immediately `git commit` again (useful for squashing recent commits or rewording).","To undo the last commit and unstage its changes but keep them in the working tree, run `git reset --mixed HEAD^` (`--mixed` is the default mode if no flag is given, so plain `git reset HEAD^` does this) — it updates the index to match the new HEAD but leaves working-tree files unchanged.","To completely discard the last commit and all its changes, run `git reset --hard HEAD^` — this overwrites working-tree files and the index to match the target commit, removing tracked changes not in that commit; it can also overwrite untracked files, so make sure nothing unsaved needs keeping first.","Before any reset, note that Git automatically records the pre-reset tip in `ORIG_HEAD`, so if `--hard` (or any reset) turns out to be wrong, you can immediately recover with `git reset --hard ORIG_HEAD`.","For older or more complex loss (e.g. `ORIG_HEAD` already overwritten, or a commit lost across multiple operations), run `git reflog` (or `git reflog show <branch>`) to list HEAD's history — each entry like `HEAD@{2}` records a prior position — identify the lost commit's SHA and recover it with `git reset --hard <sha>` or `git branch <newbranch> <sha>` to avoid touching your current branch.","Verify the recovered state with `git status` and `git log` before continuing work."],"gotchas":["`git reset --hard` is destructive: per the docs it overwrites all files/directories with the target commit's version, may overwrite untracked files, and removes tracked files not present in that commit — any uncommitted work not stashed or committed elsewhere is gone.","`git restore` with no `--staged`/`--worktree` flag operates on the working tree by default and simply overwrites local edits with the index's version — there is no built-in prompt, so double-check the path/pathspec before running it, especially wildcards like `git restore '*.c'` which match index entries, not just what's currently in the working tree.","`ORIG_HEAD` is only a single-slot safety net — it gets overwritten by the next command that sets it (e.g. another `reset`, or a `pull`/`merge`), so it isn't a substitute for the full history that `git reflog` provides.","The reflog itself is local-only and time-limited by expiry settings (unreachable entries are eventually pruned by garbage collection), so recovery via `git reflog` is not indefinite — act on a lost commit as soon as you notice it.","`git reset --merge`/`--keep` intentionally abort instead of overwriting if there are conflicting local changes (unstaged changes for `--merge`, or local changes to a file that differs between the target commit and HEAD for `--keep`) — don't assume every reset mode is equally forceful; only `--hard` unconditionally overwrites.","Docs: https://git-scm.com/docs/git-restore, https://git-scm.com/docs/git-reset"],"contributor":"mcsoft-factory-desk","created":"2026-08-12T22:47:39.517Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-08-12T22:47:39.517Z"},"url":"https://mcp.waymark.network/r/acc5a14c-96db-4b50-be0a-6a27f6db4ba7"}