How to Remove Local Untracked Files from Git Working Tree
Over time, your Git working directory accumulates untracked files from builds, temporary files, downloaded dependencies, or experimental code that you never added to Git. These files can clutter your workspace and interfere with operations like switching branches or pulling updates.
In this guide, you'll learn how to safely remove untracked files from your Git working tree using the git clean
command and its various options.
Prerequisites
You'll need Git installed and a repository with some untracked files to work with. Understanding the difference between tracked, staged, and untracked files in Git will help you use these commands safely.
Understanding Untracked Files
Untracked files are files in your working directory that Git doesn't know about. They haven't been added to the staging area or committed to the repository. You can see these files when you run:
git status
The output shows untracked files in a section like this:
Untracked files:
(use "git add <file>..." to include in what will be committed)
build/
temp.log
node_modules/
.DS_Store
These files exist in your working directory but aren't part of your Git repository.
Using git clean for Basic File Removal
The git clean
command removes untracked files from your working directory. However, it requires flags to actually perform the removal for safety reasons.
To see what files would be removed without actually deleting them:
git clean -n
The -n
flag (or --dry-run
) shows you what would be deleted:
Would remove build/output.js
Would remove temp.log
Would remove debug.txt
To actually remove untracked files:
git clean -f
The -f
flag forces the removal of untracked files. Git requires this flag to prevent accidental deletions.
Removing Untracked Directories
By default, git clean
only removes files, not directories. To remove untracked directories as well:
git clean -fd
The -d
flag includes directories in the removal process. This is useful for cleaning up build output folders or temporary directories:
# Preview what directories would be removed
git clean -nd
# Remove files and directories
git clean -fd
Interactive Cleaning
For more control over what gets deleted, use interactive mode:
git clean -i
This presents a menu where you can choose what to clean:
Would remove the following items:
build/
temp.log
node_modules/
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers
4: ask each 5: quit 6: help
What now>
You can select specific files or use patterns to clean selectively.
Respecting .gitignore Rules
By default, git clean
respects your .gitignore
file and won't remove files that are ignored. To remove ignored files as well:
git clean -fx
The -x
flag removes ignored files too. This is useful for cleaning build artifacts or dependencies that are normally ignored:
# Remove everything, including ignored files
git clean -fdx
# Preview what would be removed, including ignored files
git clean -ndx
Cleaning Specific Paths
You can limit cleaning to specific directories or file patterns:
# Clean only the build directory
git clean -fd build/
# Clean all .log files
git clean -f "*.log"
# Clean multiple specific paths
git clean -fd src/temp/ docs/build/ "*.tmp"
Common Cleaning Scenarios
Cleaning Build Artifacts
After a build process creates temporary files:
# Preview build cleanup
git clean -ndx build/ dist/ "*.o" "*.exe"
# Remove build artifacts
git clean -fdx build/ dist/ "*.o" "*.exe"
Preparing for Branch Switch
Before switching branches, clean untracked files that might cause conflicts:
# Check what's untracked
git status
# Clean everything to prepare for branch switch
git clean -fd
# Now switch branches
git checkout feature-branch
Post-Merge Cleanup
After merging branches, remove any leftover temporary files:
# Clean up after merge
git clean -fd
# Include ignored files if needed
git clean -fdx
Safety Measures and Best Practices
Always use the dry-run option first to see what would be deleted:
# Always check first
git clean -nd
# If the output looks correct, proceed
git clean -fd
Create a backup or stash important untracked files before cleaning:
# Add important untracked files to staging
git add important-untracked-file.txt
# Or move them temporarily
mkdir ../backup
mv important-files/* ../backup/
# Now clean safely
git clean -fd
Use .gitignore
to protect files you want to keep:
# Add files you want to protect to .gitignore
echo "keep-this-file.txt" >> .gitignore
echo "important-config/" >> .gitignore
# Now git clean won't remove these files
git clean -fd
Advanced Usage Examples
Clean Everything Except Specific Files
Use the exclude option to protect certain files:
# Clean everything except files matching a pattern
git clean -fd -e "*.important" -e "config/"
Clean Only Specific File Types
Target specific file extensions or patterns:
# Remove only temporary files
git clean -f "*.tmp" "*.temp" "*.log"
# Remove only in specific subdirectories
git clean -fd src/temp/ tests/output/
Conditional Cleaning
Check for specific conditions before cleaning:
# Only clean if certain directories exist
if [ -d "build" ]; then
git clean -fd build/
echo "Cleaned build directory"
fi
# Clean different paths based on project type
if [ -f "package.json" ]; then
git clean -fdx node_modules/ dist/
elif [ -f "Makefile" ]; then
git clean -fdx "*.o" "*.exe" build/
fi
Automating Cleanup
Create aliases for common cleaning operations:
# Add to your ~/.gitconfig
git config --global alias.cleanall 'clean -fdx'
git config --global alias.cleanpreview 'clean -ndx'
git config --global alias.cleanfiles 'clean -f'
Use these aliases for quick cleanup:
# Preview all cleanup
git cleanpreview
# Clean everything
git cleanall
# Clean only files, not directories
git cleanfiles
Recovery After Accidental Deletion
If you accidentally delete important files with git clean
, recovery options are limited since these files weren't tracked by Git:
Check your system's trash/recycle bin if your Git client moved files there instead of permanently deleting them.
Look for backup copies in your editor's auto-save directory or temporary file locations.
Use file recovery tools specific to your operating system to attempt recovery of deleted files.
This is why the dry-run option (-n
) is so important - always check what would be deleted before running the actual clean command.
Integration with Development Workflows
Incorporate cleaning into your development routine:
# Before starting new work
git checkout main
git pull origin main
git clean -fd
# Before creating releases
git clean -fdx
npm run build
Many teams include cleaning steps in their CI/CD pipelines to ensure consistent build environments.
Understanding git clean
helps you maintain a tidy working directory and avoid issues caused by leftover files. Always use the preview option first, respect your .gitignore
settings, and consider the implications before removing files that might be important to your development workflow.
Found an issue?