How do I discard the changes to a single file and overwrite it with a fresh HEAD copy? I want to do git reset --hard
to only a single file.
9 Answers
To reset both the working copy of my-file.txt
and its state in the Git index to that of HEAD:
git checkout HEAD -- my-file.txt
--
means "treat every argument after this point as a filename". More details in this answer. Thanks to VonC for pointing this out.
-
79More complete answer. +1 ;) For the '--', see also stackoverflow.com/questions/6561142/… (and, more generally, stackoverflow.com/questions/1192180/…)– VonCCommented Aug 22, 2011 at 12:19
-
13Also, don't forget you can reference a previous commit with
HEAD~1
to indicate the penultimate commit.– RyanmtCommented Feb 13, 2015 at 22:50 -
24You can leave out
HEAD
if you are at the head of the current branch - see norbauer.com/rails-consulting/notes/…– cxwCommented Jun 8, 2015 at 15:41 -
7Any insight why the
reset
command (as it says) "cannot do hard reset with paths", and then why thecheckout
command is not (cannot be?) used for hard-resetting the whole set? (I mean why it has been designed so.)– Sz.Commented Feb 1, 2017 at 19:24 -
2@cxw Unfortunately, this is not quite true. From the man page of
git checkout
: "Overwrite paths in the working tree by replacing with the contents in the index or in the <tree-ish>". I.e. if<tree-ish>
is omitted, whatever content in the index will be used to update the working tree. This may or may not differ from HEAD.– tuntapCommented Dec 25, 2017 at 11:58
Since Git 2.23 (August 2019) you can use restore
(more info):
git restore pathTo/MyFile
The above will restore MyFile
on HEAD
(the last commit) on the current branch.
If you want to get the changes from other commit you can go backwards on the commit history. The below command will get MyFile
two commits previous to the last one. You need now the -s
(--source
) option since now you use master~2
and not master
(the default) as you restore source:
git restore -s master~2 pathTo/MyFile
You can also get the file from other branch!
git restore -s my-feature-branch pathTo/MyFile
-
13It should be noted that the git documentation still marks this command as experimental.– MalheloCommented Aug 20, 2020 at 9:53
-
1It’s important to understand that git restore <file> is a dangerous command. Any local changes you made to that file are gone — Git just replaced that file with the last staged or committed version. Don’t ever use this command unless you absolutely know that you don’t want those unsaved local changes. (from the docs)– refaelioCommented Jan 19, 2022 at 8:06
-
6@refaelio Overwriting local changes is the entire point. Is there some other operation that this command might be confused with?– ChrisCommented Mar 15, 2022 at 13:54
-
Reset to head:
To hard reset a single file to HEAD:
git checkout @ -- myfile.ext
Note that @
is short for HEAD
. An older version of git may not support the short form.
Reset to index:
To hard reset a single file to the index, assuming the index is non-empty, otherwise to HEAD:
git checkout -- myfile.ext
The point is that to be safe, you don't want to leave out @
or HEAD
from the command unless you specifically mean to reset to the index only.
-
4
-
7@LanceKind As I understand, that's used to demarcate a list of filenames which follows it. Without it, there are cases when git interprets the arguments incorrectly. Commented Jul 24, 2017 at 23:18
-
9Not just filenames. The widely used convention separates options from positional arguments in many utilities. See
man bash
page. Also mentioned in this answer: unix.stackexchange.com/a/187548/142855– boweebCommented Apr 25, 2019 at 13:37 -
6Conventionally, the
--
is used to tell the programI've finished specifying "options", and from here on, everything will be a positional argument.
. Conventionally, "options" are the tokens like--recursive
which can appear in any order, or even be combined together in their short form, like withrm -rf
. On the contrary, "positional arguments" are much more like arguments passed to a function in a programming language: their position in the list of tokens defines what exactly the program is going to do with them (these are often filenames).--
removes ambiguity as to which is which.– ionoCommented Sep 24, 2019 at 6:02 -
This is not "hard" resetting anything it just applies changes from some commit and requires additional commit. On branch level hard reset, however, your changes are simply reverted to the commit you wanted to reset to without any additional commit– FaridCommented Nov 2, 2021 at 9:24
To revert to upstream/master do:
git checkout upstream/master -- myfile.txt
-
-
4In this example,
upstream
is the name of their remote. Most likely yours isorigin
. Commented Oct 13, 2022 at 14:06
You can use the following command:
git checkout filename
If you have a branch with the same file name you have to use this command:
git checkout -- filename
-
1This will not "hard reset" the file - it only copies the index state to the working tree. A "hard reset" would first reset the index.– A.H.Commented Apr 30, 2019 at 18:45
you can use the below command for reset of single file
git checkout HEAD -- path_to_file/file_name
List all changed files to get path_to_file/filename
with below command
git status
You can use the following command:
git reset -- my-file.txt
which will update both the working copy of my-file.txt
when added.
-
5Does not change the content of the modified file, as requested.– RafaelCommented Aug 27, 2019 at 12:23
-
4That's not specifically the point @ADDQU. The question is how to "hard reset" a file, not to remove it from the staged list.– RafaelCommented Aug 29, 2019 at 6:42
-
@Rafael You are correct, but I want to let you know that there is a way too.– ADDYQUCommented Aug 30, 2019 at 8:14
A simple, easy, hands-on, way to get you out of hot water, especially if you're not so comfortable with git:
View the log of your file
git log myFile.js
commit 1023057173029091u23f01w276931f7f42595f84f Author: kmiklas Date: Tue Aug 7 09:29:34 2018 -0400
JIRA-12345 - Refactor with new architecture.
Note hash of file:
1023057173029091u23f01w276931f7f42595f84f
Show the file using the hash. Make sure it's what you want:
git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js
Redirect file to a local copy
git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js > myFile.07aug2018.js
Back up your current file.
cp myFile.js myFile.bak.js
Open both files in your favorite text editor.
vim myFile.js
vim myFile.07aug2018.jsCopy n' paste code from myFile.07aug2018.js to myFile.js, and save.
Commit and push myFile.js
Again view the log, and confirm that your file is properly in place.
Tell your clients to pull the latest, happily watch it work with the old version in place.
Not the sexiest, or most git-centric solution, and definitely a "manual" reset/reversion, but it works. It requires minimal knowledge of git, and doesn't disturb the commit history.
-
5This answer is far more complex and error prone than any of the solutions which predate it by years.– Artif3xCommented Apr 9, 2019 at 13:12
-
6Why should anyone use this solution!? the true answer is only a simple command. Commented Apr 30, 2019 at 19:00
-
2This is the optimal solution for certain circumstances. It has merit for those in a bind, where git is malfunctioning, and for those who need a work-around.– kmiklasCommented May 1, 2019 at 21:03
-
@kmiklas out of curiosity, what
certain circumstances
is this ideal? Commented Apr 16, 2021 at 23:07 -
"It requires minimal knowledge of git" - this is a (huge) downside, not an upside– refaelioCommented Jan 19, 2022 at 8:10
git checkout
below is the answer. In git, "revert" is something you do to a commit. "Revert" replays the inverse of a historical commit into your working directory, so you can make a new commit that "undoes" the reverted commit. I find this is a frequent point of confusion for people coming to git from svn.