Reverting to a Pristine Working Directory
Git is a powerful version control system, but sometimes you might find yourself needing to discard all local changes – both tracked and untracked – to return your working directory to a clean state, mirroring the last commit. This is a common scenario when you’ve experimented with code, encountered issues, or simply want a fresh start. This tutorial will guide you through the process, explaining the commands and their nuances.
Understanding Tracked vs. Untracked Files
Before we begin, it’s crucial to understand the difference between tracked and untracked files:
- Tracked Files: These are files that Git knows about – they’ve been previously committed to the repository. Changes to tracked files can be staged, committed, or reverted.
- Untracked Files: These are files that exist in your working directory but haven’t been added to the Git repository. Git doesn’t manage these files, and they won’t be included in commits unless you explicitly add them. This often includes build artifacts, temporary files, or newly created files you haven’t yet staged.
Resetting Tracked Files
To discard changes to tracked files – effectively reverting them to the state of the last commit – use the git checkout
command with the .
(dot) argument.
git checkout -- .
The --
is a separator that tells Git to treat the following arguments as file paths, even if they might resemble Git options. The .
specifies the current directory, meaning the command will apply to all tracked files within the current directory and its subdirectories. This command will not affect untracked files.
You can also apply this to a specific subdirectory:
git checkout -- path/to/subdirectory
Removing Untracked Files and Directories
After resetting tracked files, you’ll likely want to remove untracked files and directories. This is where the git clean
command comes in.
The basic usage is:
git clean -fd
Let’s break down the options:
-f
(or--force
): This option is required unless theclean.requireForce
Git configuration variable is set tofalse
. It forces the removal of untracked files.-d
: This option includes untracked directories in the removal process. Without this, only untracked files would be deleted.
Important Safety Considerations:
-
Dry Run: Before actually deleting anything, it’s highly recommended to perform a dry run using the
-n
option. This will show you which files and directories would be deleted without actually deleting them.git clean -nfd
-
Ignored Files: By default,
git clean
doesn’t remove files listed in your.gitignore
file. If you want to remove ignored files as well, add the-x
option:git clean -fxd
Be extremely cautious when using
-x
, as you might accidentally delete important files that you intended to ignore. -
Recursive Cleaning: To clean the entire repository (from the root directory), use a forward slash
/
:git clean -fdx /
Again, exercise extreme caution when using this command.
Combining the Commands for a Complete Reset
To completely reset your working directory to the state of the last commit, you can combine the git checkout
and git clean
commands:
-
Reset tracked files:
git checkout -- .
-
Remove untracked files and directories:
git clean -fd
This sequence effectively discards all local changes, leaving you with a clean working directory that mirrors the last committed state. Always remember to use the -n
flag with git clean
for a dry run before executing the actual deletion.