Discard Local Changes and Switch Branch
When you need to abandon local work entirely and move to a different branch, two commands handle the two categories of changes: git restore resets tracked files that have been modified, and git clean removes untracked files and folders that Git has never recorded. Both steps are needed for a fully clean working tree. This case can happen when unwanted local changes made in production such as celery outputs, local data updates etc.
Understand the two categories
Section titled “Understand the two categories”git status will show two kinds of local changes that block a clean branch switch.
- Tracked modified files: files Git knows about that have been changed since the last commit. Cleared with git restore.
- Untracked files and folders: new files or generated output that Git has never recorded. Cleared with git clean.
Preview what will be deleted
Section titled “Preview what will be deleted”Before deleting anything, do a dry run to see exactly which untracked files and folders git clean would remove. Nothing is deleted at this step.
git clean -fdnDiscard all local changes
Section titled “Discard all local changes”Once you have confirmed what will be removed, run both commands in sequence. This is permanent for untracked files and cannot be recovered.
git restore .git clean -fdgit restore . resets every tracked modified file back to the last commit. git clean -fd deletes all untracked files (-f forces the delete, -d includes untracked directories).
Switch to an existing branch
Section titled “Switch to an existing branch”If the branch already exists locally, fetch any remote updates and switch directly.
git fetch origingit switch <branch-name>Switch to a new remote branch
Section titled “Switch to a new remote branch”If the branch exists on the remote but not yet locally, create it and set tracking in one step.
git fetch origingit switch -c <branch-name> --track origin/<branch-name>Full safe sequence
Section titled “Full safe sequence”The complete sequence from a unwanted working tree to a clean branch switch, including the dry run preview.
git restore .git clean -fdn # preview - nothing deleted yetgit clean -fd # actual deletegit fetch origin
# if branch already exists locally:git switch <branch-name>
# if branch is remote only:git switch -c <branch-name> --track origin/<branch-name>