How do I clear my local working directory in Git? [duplicate]
Asked Answered
C

6

778

How can I clear my working directory in Git?

Camper answered 23/3, 2009 at 13:43 Comment(3)
User interactive approach: git clean -i -fdLepton
I don't understand why this question has been flagged duplicate. That other question clearly deals with removing only untracked files from working directory and not modified filesSystematism
@Systematism Sure, but this question is vague and doesn't explicitly refer to modified files.Multiplex
S
1179

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:

Steiermark answered 24/3, 2009 at 0:57 Comment(10)
Note that by default, 'git clean -d' is insufficient. You need to also add the -f (force) flag. Also, if you want to additionally delete the files that are ignored by .gitignore, then you need to add the -x option. Here's what it all looks like: git clean -xdfWhydah
However be sure to NOTE that command will also blow away your local sqlite database -- not undo recent changes, but actually delete it. Sp the "-x" option might NOT ne a good idea depending on what you are trying to do.Ragouzis
I am 100% sure I run git clean -d -f ( without -x ) and it also deleted ignored files.Paulettepauley
Please note: the suggestion to delete all the files except the .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
One thing I found in trying to use this command, is knowing if that was in fact the problem. Turns out one of my colleagues had the dropdown in 'Working Copy' at the top of the page set to 'All Files' when it should be 'Pending'. This gave the appearance that a load of files were being changed, when in fact, it was just showing all the files in the project, as it should do. So the fix for this issue was just to select 'Pending Files' from the dropdown in 'Working Copy' screen. Let me know if this helps anyone.Algebra
Note also that git clean -d -x -f will blow away symlinks to outside directories.Armrest
The 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
Warning don't forget -n for a dry-run !Daltondaltonism
Quick addition: you could reset the entire subdirectory using wildcards like this. Notice the quotes around the pattern. git checkout master 'subdir/*' Bert
git restore <deleted files> was required in my case, after the clean -dxf .Sofia
P
164

Use:

git clean -df

It's not well advertised, but git clean is really handy. Git Ready has a nice introduction to git clean.

Pasahow answered 23/3, 2009 at 13:45 Comment(6)
I suggest to not use the -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 parameterMilky
Oops. git clean -xdf also removed .gitignore, and I did not notice before the next commit. I won't ignore .gitignore anymore. :)Underact
@Underact git clean -xdf will remove .gitignore if and only if it has not been added to, thus working as intended.Pasahow
let's highlight this: 𝐈 𝐬𝐮𝐠𝐠𝐞𝐬𝐭 𝐭𝐨 𝐧𝐨𝐭 𝐮𝐬𝐞 𝐭𝐡𝐞 -𝐱 𝐩𝐚𝐫𝐚𝐦𝐞𝐭𝐞𝐫 𝐚𝐬 𝐢𝐭 𝐰𝐢𝐥𝐥 𝐫𝐞𝐦𝐨𝐯𝐞 𝐚𝐥𝐥 𝐠𝐢𝐭𝐢𝐠𝐧𝐨𝐫𝐞𝐝 𝐜𝐨𝐧𝐭𝐞𝐧𝐭Neelon
@mef I use 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
@Pasahow sure, everyone is free to use -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
S
51

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.

Sudra answered 19/12, 2012 at 0:24 Comment(5)
Is branch name really required? For me git reset --hard simply works for current working branch without branch name.Philanthropist
Without the branch, it does not clear local commits.Sudra
ohh. ok. My observation was only regarding the local modified and newly added untracked files. So if I got you correctly, if any file is staged or has already been committed in local branch (not pushed as yet) will not get cleaned if I do not use the branch name explicitly. Correct?Philanthropist
Super. I verified your observation. You were correct buddy. git reset --hard doesn't clear local commits until you specify the branch name explicitly. +1.Philanthropist
Git really has to be the most complex and unfriendly source control system. I tried everything to fix up my local copy, and only this worked. Thanks.Stagnate
S
15

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.

Subdual answered 25/1, 2013 at 5:23 Comment(6)
This can also be a nice way to save some disk-space in a pinch.Subdual
A much faster way to create the empty checkout: true | git mktree | xargs git commit-tree | xargs git tag emptyVandal
Note: There seems to be some value in using an empty commit as the base for projects. This makes it easier to perform full-project rebase operations in case your initial commit needs to be fixed -- and may simplify things when pushing an existing git repository to svn.Subdual
Like most other workflows, this gets messy if you are using Git submodules.Subdual
'git init && git commit --allow-empty "EMPTY COMMIT && git tag empty' would do the job of the first block too.Schalles
You may have better luck if you do a make clean or equivalent before checking out empty. :)Subdual
A
9

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.

Ayesha answered 18/10, 2013 at 16:2 Comment(0)
M
2

To reset a specific file as git status suggests:

git checkout <filename>

To reset a folder

git checkout <foldername>/*
Morgen answered 21/3, 2013 at 18:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.