How can I clear my working directory in Git?
To reset a specific file to the last-committed state (to discard uncommitted changes in a specific file):
git checkout thefiletoreset.txt
This is mentioned in the git status
output:
(use "git checkout -- <file>..." to discard changes in working directory)
To reset the entire repository to the last committed state:
git reset --hard
To remove untracked files, I usually just delete all files in the working copy (but not the .git/
folder!), then do git reset --hard
which leaves it with only committed files.
A better way is to use git clean
(warning: using the -x
flag as below will cause Git to delete ignored files):
git clean -d -x -f
will remove untracked files, including directories (-d
) and files ignored by git (-x
). Replace the -f
argument with -n
to perform a dry-run or -i
for interactive mode, and it will tell you what will be removed.
Relevant links:
- git-reset man page
- git-clean man page
- git ready "cleaning up untracked files" (as Marko posted)
- Stack Overflow question "How to remove local (untracked) files from the current Git working tree")
.git/
folder and then restore by running git reset --hard
will probably take a long time if your repo has been around for any time at all. Please don't do this. Use git clean
. –
Dishpan git clean -d -x -f
will blow away symlinks to outside directories. –
Armrest git clean -fdx
option is very useful. It helped me delete some untracked files that were hidden and that I did not know that were affecting my compilation. –
Knout -n
for a dry-run ! –
Daltondaltonism git checkout master 'subdir/*'
–
Bert git restore <deleted files>
was required in my case, after the clean -dxf . –
Sofia Use:
git clean -df
It's not well advertised, but git clean
is really handy. Git Ready has a nice introduction to git clean
.
-x
parameter as it will remove all gitignored content. Say you have a folder named 'gitignored
' added to .gitignore
, and you store there your files that have to be secure, you're also deleting them using -x
parameter –
Milky git clean -xdf
also removed .gitignore
, and I did not notice before the next commit. I won't ignore .gitignore
anymore. :) –
Underact git clean -xdf
will remove .gitignore
if and only if it has not been added to, thus working as intended. –
Pasahow git clean -xdf
all the time instead of make clean, ant clean, mvn clean or whatever else. There's no general rule, and everyone is free to use -x
or not. –
Pasahow -x
or not. But some people may read this github answer, copy-paste the command, and without realizing it loose all their gitignored files they wanted to keep. Then come back here and only notice @Highmastdon's comment, about the consequence of using -x
. –
Neelon All the answers so far retain local commits. If you're really serious, you can discard all local commits and all local edits by doing:
git reset --hard origin/branchname
For example:
git reset --hard origin/master
This makes your local repository exactly match the state of the origin (other than untracked files).
If you accidentally did this after just reading the command, and not what it does :), use git reflog to find your old commits.
git reset --hard
simply works for current working branch without branch name. –
Philanthropist git reset --hard
doesn't clear local commits until you specify the branch name explicitly. +1. –
Philanthropist You could create a commit which contains an empty working copy.
This is a generally safe, non-destructive approach because it does not involve the use of any brute-force reset mechanisms. First you hide all managed content with git checkout empty
, then you are free to manually review and remove whatever unmanaged content remains.
## create a stand-alone, tagged, empty commit
true | git mktree | xargs git commit-tree | xargs git tag empty
## clear the working copy
git checkout empty
Your working copy should now be clear of any managed content. All that remains are unmanaged files and the .git
folder itself.
To re-populate your working copy...
git checkout master ## or whatever branch you will be using
If you're a forward thinking individual, you might start your repository off on the right foot by basing everything on an initial empty commit...
git init
git commit --allow-empty --allow-empty-message -m ""
git tag empty
...
There are various uses for a tagged empty worktree. My favorite at the moment is to depopulate the root under a set of git worktree
subfolders.
true | git mktree | xargs git commit-tree | xargs git tag empty
–
Vandal make clean
or equivalent before checking out empty
. :) –
Subdual To switch to another branch, discarding all uncommitted changes (e.g. resulting from Git's strange handling of line endings):
git checkout -f <branchname>
I had a working copy with hundreds of changed files (but empty git diff --ignore-space-at-eol
) which I couldn't get rid off with any of the commands I read here, and git checkout <branchname>
won't work, either - unless given the -f
(or --force
) option.
To reset a specific file as git status suggests:
git checkout <filename>
To reset a folder
git checkout <foldername>/*
© 2022 - 2024 — McMap. All rights reserved.
untracked
files fromworking directory
and notmodified
files – Systematism