Reputation: 47795
I ran git status
which told me everything was up to date and there were no local changes.
Then I made several consecutive changes and realized I wanted to throw everything away and get back to my original state. Will this command do it for me?
git reset --hard HEAD
Upvotes: 2696
Views: 2957055
Reputation: 3443
Simplest solution imo:
# Execute on the root of the working tree...
# Discard all changes to tracked files
git checkout .
# Remove all untracked files
git clean -fd
Note: ignored files will remain unaffected
Upvotes: 31
Reputation: 907
After reading a bunch of answers and trying them, I've found various edge cases that mean sometimes they don't fully clean the working copy.
Here's my current bash script for doing it, which works all the time.
#!/bin/sh
git reset --hard
git clean -f -d
git checkout HEAD
Run from working copy root directory.
Upvotes: 76
Reputation: 96454
If you want to revert all changes AND be up-to-date with the current remote master (for example you find that the master HEAD has moved forward since you branched off it and your push is being 'rejected') you can use
git fetch # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.
Upvotes: 130
Reputation: 39243
GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
.gitignore
(like build files).gitignore
Following are other commands I forget daily.
git clean --force -d -x
git reset --hard
.gitignore
(like build files).gitignore
git clean --force -d -x
.gitignore
(like build files).gitignore
git reset --hard
.gitignore
(like build files).gitignore
Test case for confirming all the above (use bash or sh):
mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'
See also
git revert
to make new commits that undo prior commitsgit checkout
to go back in time to prior commits (may require running above commands first)git stash
same as git reset
above, but you can undo itUpvotes: 300
Reputation: 6923
The multitude of answers here, including the accepted answer, always leaves me questioning which commands I should run.
Many have warnings, and despite visiting this question many times, I can never remember which combination I should, or more importantly should not, run.
So, I am leaving this here for myself when I revisit the topic next week.
git restore .
git clean -f
git clean -fd
For most scenarios you can simply combine the commands, but as I point out in my explanation some cases require you delete files first, then the directories that hold them.
git restore . && git clean -fd
Explanation:
The command git restore .
performs a checkout on the current branch to the current directory. This will undo any changes made to any files. More specifically, the command will revert all changes in tracked files to their last committed state in the current directory and subdirectories.
The command git clean -f
removes any newly added (untracked) files since the restore. This command permanently deletes files and cannot be undone.
The command git clean -fd
removes any newly added directories since the restore. This command permanently deletes directories and their files and cannot be undone.
Note: I am not a git
expert, just someone who uses git professionally, every day, all day, for many years. I advise you to consult the documenation.
With that said -fd
should take care of -f
but there are exceptions where it blows up. In my experience, executing all three commands works. It is kind of like calling Directory.Delete(path, recursive=true)
which should delete all files but sometimes for whatever reason (depending on your OS) you must delete each file first before deleting the directory.
Another Note: Misleading Warning in Accepted Answer And Other Answers: The accepted answer's warning regarding git reset ("Warning this will reset all of your unpushed commits to master!") might be misleading. git reset
without any arguments defaults to git reset --mixed HEAD
, which only affects the staging area (index) and not the working tree or commit history. git reset
does not revert commits or affect the branch history unless combined with a commit reference (like git reset --hard <commit>
), which indeed can change the commit history in the local repository.
Upvotes: 3
Reputation: 68
It's a headache, you can try:
git stash --all
git stash apply
This will discard all local changes from the history and keep the files inside the folder.
Upvotes: 1
Reputation: 617
Using git version "2.37.1"
I reverted all my local changes ( not yet committed ) to previous state ( prior to my local changes ) by using the following command :
git checkout -p
Documentation snippet :
you can use git checkout -p to selectively discard edits from your current working tree
From man git-checkout
-p, --patch Interactively select hunks in the difference between the <tree-ish> (or the index, if unspecified) and the working tree. The chosen hunks are then applied in reverse to the working tree (and if a <tree-ish> was specified, the index). **This means that you can use git checkout -p to selectively discard edits from your current working tree.** See the “Interactive Mode” section of git-add(1) to learn how to operate the --patch mode. Note that this option uses the no overlay mode by default (see also --overlay), and currently doesn’t support overlay mode.
Upvotes: 0
Reputation: 5850
You may not necessarily want/need to stash your work/files in your working directory but instead simply get rid of them completely. The command git clean
will do this for you.
Some common use cases for doing this would be to remove cruft that has been generated by merges or external tools or remove other files so that you can run a clean build.
Keep in mind you will want to be very cautious of this command, since its designed to remove files from your local working directory that are NOT TRACKED. if you suddenly change your mind after executing this command, there is no going back to see the content of the files that were removed. An alternative which is safer is to execute
git stash --all
which will remove everything but save it all in a stash. This stash can then later be used.
However, if you truly DO want to remove all the files and clean your working directory, you should execute
git clean -f -d
This will remove any files and also any sub-directories that don't have any items as a result of the command. A smart thing to do before executing the git clean -f -d
command is to run
git clean -f -d -n
which will show you a preview of what WILL be removed after executing git clean -f -d
So here is a summary of your options from most aggressive to least aggressive
Option 1: Remove all files locally(Most aggressive)
git clean -f -d
Option 2: Preview the above impact(Preview most aggressive)
git clean -f -d -n
Option 3: Stash all files (Least aggressive)
git stash --all
Upvotes: 6
Reputation: 135245
To revert changes made to your working copy, do this:
git checkout .
Or equivalently, for git version >= 2.23:
git restore .
To revert changes made to the index (i.e., that you have added), do this. Warning this will reset all of your unpushed commits to master!:
git reset
To revert a change that you have committed:
git revert <commit 1> <commit 2>
To remove untracked files (e.g., new files, generated files):
git clean -f
Or untracked directories (e.g., new or automatically generated directories):
git clean -fd
Upvotes: 4652
Reputation: 466
Two simple steps
git fetch origin
git reset --hard origin/master
or if your git uses main instead master use this:
git reset --hard origin/main
Upvotes: 10
Reputation: 16875
Try this if you are in top project directory:
git restore .
If not then use:
git restore :/
If you would like to revert local changes for a subset:
git restore :/
git restore .
git restore '*.c'
For details see git restore documentation.
To remove untracked files: git clean -f
Upvotes: 33
Reputation: 165
If you just want to delete all the changes, go for git checkout .
It's the faster and simpler one.
Upvotes: 5
Reputation: 22068
Adding another option here.
I'm referring to the title: Revert local changes.
It can also apply to changes that weren't staged for commit.
In this case you can use:
git restore <file>
To go back to previous state.
Upvotes: 8
Reputation: 4381
simply execute -
git stash
it will remove all your local changes. and you can also use it later by executing -
git stash apply
Upvotes: 45
Reputation: 5223
This question is more about broader repository reset / revert, but in case if you're interested in reverting individual change - I've added similar answer in here:
https://stackoverflow.com/a/60890371/2338477
Answers to questions:
How to revert individual change with or without change preserving in git history
How to return back to old version to restart from same state
Upvotes: 0
Reputation: 27395
I searched for a similar issue,
Wanted to throw away local commits:
So did the below:
git reset --hard origin/dev
Check:
git status
On branch dev
Your branch is up-to-date with 'origin/dev'.
nothing to commit, working tree clean
now local commits are lost, back to the initial cloned state, point 1 above.
Upvotes: 26
Reputation: 1817
Try this for revert all changes uncommited in local branch
$ git reset --hard HEAD
But if you see a error like this:
fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.
You can navigate to '.git' folder then delete index.lock file:
$ cd /directory/for/your/project/.git/
$ rm index.lock
Finaly, run again the command:
$ git reset --hard HEAD
Upvotes: 9
Reputation: 13585
Note: You may also want to run
git clean -fd
as
git reset --hard
will not remove untracked files, where as git-clean will remove any files from the tracked root directory that are not under git tracking. WARNING - BE CAREFUL WITH THIS! It is helpful to run a dry-run with git-clean first, to see what it will delete.
This is also especially useful when you get the error message
~"performing this command will cause an un-tracked file to be overwritten"
Which can occur when doing several things, one being updating a working copy when you and your friend have both added a new file of the same name, but he's committed it into source control first, and you don't care about deleting your untracked copy.
In this situation, doing a dry run will also help show you a list of files that would be overwritten.
Upvotes: 509
Reputation: 11819
DANGER AHEAD: (please read the comments. Executing the command proposed in my answer might delete more than you want)
to completely remove all files including directories I had to run
git clean -f -d
Upvotes: 38
Reputation: 1323
I met a similar problem.
The solution is to use git log
to look up which version of the local commit is different from the remote. (E.g. the version is 3c74a11530697214cbcc4b7b98bf7a65952a34ec
).
Then use git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec
to revert the change.
Upvotes: 29
Reputation: 212198
Look into git-reflog. It will list all the states it remembers (default is 30 days), and you can simply checkout the one you want. For example:
$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
Upvotes: 54