git-fresh
Quickly reset your Git working directory to a clean state without re-cloning. Stashes, wipes, restores, and pops.
Why git-fresh?
Many developers have the habit of deleting their entire project and running git clone again when they encounter issues with their working directory. This is unnecessary and time-consuming! Instead, git-fresh performs the following operations:
- Stash your current changes (if any)
- Remove all files except the
.git directory
- Restore all files from Git
- Pop the stashed changes back
This achieves the same result as re-cloning but much faster and without losing your Git history or remotes.
Installation
You can run git-fresh directly using npx without installing it globally:
npx git-fresh
Or with other package managers:
pnpm dlx git-fresh
yarn dlx git-fresh
bunx git-fresh
Or install it globally:
npm install -g git-fresh
bun add -g git-fresh
pnpm add -g git-fresh
yarn global add git-fresh
Usage
Simply run the command in any Git repository:
npx git-fresh
Or if installed globally:
git-fresh
Command Line Options
You can use various options to customize the behavior of git-fresh:
--ignore-env-files
Protects environment files from being removed during the reset process. This includes files matching patterns like .env, .env.*, *.env, and .*.env.
npx git-fresh --ignore-env-files
When this option is used, you'll be prompted to choose which environment files to protect, unless you also use --skip-confirmation.
--skip-confirmation
When used with --ignore-env-files, this option skips the interactive confirmation and automatically protects all detected environment files.
npx git-fresh --ignore-env-files --skip-confirmation
--ignore-glob-files <pattern>
Protects files matching the specified glob pattern from being removed during the reset process. This is useful for protecting specific files or file types that you want to keep.
npx git-fresh --ignore-glob-files "*.config"
npx git-fresh --ignore-glob-files "temp/**"
npx git-fresh --ignore-glob-files "**/*.{log,tmp}"
Combining Options
You can combine multiple options as needed:
npx git-fresh --ignore-env-files --ignore-glob-files "*.local" --skip-confirmation
What happens when you run git-fresh?
The tool will output progress information as it performs each step:
🚀 Git Fresh - Resetting working directory
✓ Changes stashed successfully
✓ Files removed successfully
✓ Files restored successfully
✓ Stashed changes applied successfully
🎉 Git working directory reset successfully!
Example Usage Scenarios
Scenario 1: Clean repository (no uncommitted changes)
$ npx git-fresh
🚀 Git Fresh - Resetting working directory
ℹ No changes to stash
✓ Files removed successfully
✓ Files restored successfully
🎉 Git working directory reset successfully!
Scenario 2: Repository with uncommitted changes
$ npx git-fresh
🚀 Git Fresh - Resetting working directory
✓ Changes stashed successfully
✓ Files removed successfully
✓ Files restored successfully
✓ Stashed changes applied successfully
🎉 Git working directory reset successfully!
Scenario 3: Repository with conflicts during stash pop
$ npx git-fresh
🚀 Git Fresh - Resetting working directory
✓ Changes stashed successfully
✓ Files removed successfully
✓ Files restored successfully
⚠ Could not apply stashed changes (conflicts may exist)
Run "git stash list" to see your stashed changes
🎉 Git working directory reset successfully!
Before and After
Before running git-fresh:
- Modified files:
README.md, src/index.js
- Untracked files:
temp.txt, debug.log
- Deleted files:
old-file.js (was in git)
- Working directory is "dirty"
After running git-fresh:
- All files are restored to their committed state
- All untracked files are preserved (via stash)
- All modified files are preserved (via stash)
- Working directory is "clean" but changes are recoverable
- Git history and remotes are unchanged
What it does
- Checks if you're in a Git repository
- Stashes any uncommitted changes (including untracked files)
- Removes all files and directories except
.git
- Restores all files from the Git repository
- Applies the stashed changes back (if any were stashed)
Requirements
- Node.js 14.0.0 or higher
- Git repository
Safety
- Your Git history remains intact
- Uncommitted changes are safely stashed and restored
- The
.git directory is never touched
- If conflicts occur during stash pop, your changes remain in the stash
Development
This project uses Bun for package management:
bun install
bun run build
bun run validate
Testing Locally
To test the package locally before publishing:
- Build the project:
bun run build
- Create a test Git repository in a temporary directory
- Run the CLI directly:
/path/to/git-fresh/dist/cli.js
Publishing
To publish the package to npm:
bun run validate
npm publish
Author
Leynier Gutiérrez González
License
MIT