在git中将单个文件恢复到以前的版本

这个问题在这里已经有了答案:

  • 使用Git将特定文件重置或恢复到特定修订版本? 28个答案

  • 让我们从定性描述我们想要做什么开始(其中大部分内容在Ben Straub的答案中都有说明)。 我们做了一些提交,其中五个提交了一个给定的文件,我们想把文件恢复到以前的版本。 首先,git不保留单个文件的版本号。 它只是跟踪内容 - 提交实质上是工作树的快照,以及一些元数据(例如提交消息)。 所以,我们必须知道哪个提交有我们想要的文件的版本。 一旦我们知道了,我们需要做一个新的提交将文件恢复到该状态。 (我们不能仅仅关注历史,因为我们已经推出了这些内容,并且与其他人一起编辑历史记录。)

    那么让我们从找到正确的提交开始。 您可以非常轻松地看到对给定文件进行修改的提交:

    git log path/to/file
    

    如果您的提交消息不够好,并且您需要查看每次提交中对文件所做的操作,请使用-p/--patch选项:

    git log -p path/to/file
    

    或者,如果您更喜欢gitk的图形视图

    gitk path/to/file
    

    您也可以通过查看菜单启动gitk来完成此操作; 视图的一个选项是要包含的路径列表。

    无论哪种方式,您都可以使用所需文件的版本找到提交的SHA1(哈希)。 现在,你所要做的就是:

    # get the version of the file from the given commit
    git checkout <commit> path/to/file
    # and commit this modification
    git commit
    

    (checkout命令首先将文件读入索引,然后将其复制到工作树中,因此不需要使用git add其添加到索引以准备提交。)

    如果您的文件可能没有简单的历史记录(例如重命名和复制),请参阅VonC的出色评论。 可以指导git更加仔细地搜索这些东西,而不是以速度为代价。 如果你确信历史很简单,那么你不需要麻烦。


    Git非常灵活。 你不应该需要数百个分支来做你所要求的。 如果您想要将状态恢复到第二次更改(并且确实是已经提交并推送的更改),请使用git revert 。 就像是:

    git revert a4r9593432 
    

    其中a4r9593432是要退出提交的散列的起始字符。

    如果提交包含对许多文件的更改,但您只想恢复其中一个文件,则可以使用git reset (第2或第3种格式):

    git reset a4r9593432 -- path/to/file.txt
    # the reverted state is added to the staging area, ready for commit
    git diff --cached path/to/file.txt        # view the changes
    git commit
    git checkout HEAD path/to/file.txt        # make the working tree match HEAD           
    

    但是这非常复杂,并且git reset很危险。 正如Jefromi所建议的那样,改用git checkout <hash> <file path>

    如果您只想查看提交x中的文件,您可以使用git show

    git show a4r9593432:path/to/file.txt
    

    对于所有的命令,除了通过提交哈希以外,还有很多方法可以引用提交(参见Git用户手册中的提交命名)。


    假设你的5个提交是A,B,C,D,E - A是第一个,E是最新的。 您希望将file.txt恢复为提交后的方式A.您不需要学习或记住git-reset和git-checkout命令的不同版本或选项。 跑:

    git show A:file.txt >file.txt
    
    # If you want to commit the older version:
    git add file.txt
    git commit
    

    git-show命令显示了Git存储库中任何对象的内容或信息。 当提交一个像A(或master ^或HEAD〜5或...)这样的提交引用时,后跟一个冒号,后跟一个文件名,它将显示该文件的内容,就像它在提交之后一样。 然后它只是将输出重定向到文件中。

    链接地址: http://www.djcxy.com/p/8969.html

    上一篇: Reverting a single file to a previous version in git

    下一篇: Asynchronous vs synchronous execution, what does it really mean?