Restore file from old commit in git

前端 未结 4 1806
悲哀的现实
悲哀的现实 2020-12-02 04:18

I have an old commit that I did a few weeks ago. I want to restore only a single file from that commit. What do I do?

相关标签:
4条回答
  • 2020-12-02 05:02

    I needed to restore a recent file committed into git. So just to reiterate and give another perspective, you need to do this by running the following two steps:

    1. git log -3
      This shows the three most recent commits. Read the comments and the author's name so you narrow down what exact version you want. Write down that long commit ID (e.g. b6b94f2c19c456336d60b9409fb1e373036d3d71) for the commit version you want.

    2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 -- myfile.java
      Pass the commit ID AND the file name you want to restore. Make sure you have a space before and after the double hyphen.

    There are many other ways to do it but this is the simplest one I can remember.

    NOTE: If you are inside your project path/folder then is not necessary to type the full file's path in the checkout command.

    0 讨论(0)
  • 2020-12-02 05:05

    All answers mention git checkout <tree-ish> -- <pathspec>. As of git v2.23.0 there's a new git restore method which is supposed to assume part of what git checkout was responsible for. See highlights of changes on github blog.

    The default behaviour of this command is to restore the state of a working tree with the content coming from the source parameter (which in your case will be a commit hash).

    Assuming the commit hash is abcdef the command would look like this:

    git restore --source=abcdef file_name
    

    which (by default) puts it in working tree. If you want to put the change directly in index so it can be committed straight away:

    git restore --source=abcdef --worktree --staged file_name
    

    or with short option names:

    git restore -s=abcdef -W -S file_name
    
    0 讨论(0)
  • 2020-12-02 05:09
    1. Check out the file from your old commit via git checkout [Revision_Key] -- path/to/file.
    2. Add, commit, push as appropriate.
    0 讨论(0)
  • 2020-12-02 05:10
    git checkout 'master@{7 days ago}' -- path/to/file.txt
    

    This will not alter HEAD, it will just overwrite the local file path/to/file.txt

    See man git-rev-parse for possible revision specifications there (of course a simple hash (like dd9bacb) will do nicely)

    Don't forget to commit the change (after a review...)

    0 讨论(0)
提交回复
热议问题