从git中的旧提交还原文件


Answers:


218
git checkout 'master@{7 days ago}' -- path/to/file.txt

这不会改变HEAD,只会覆盖本地文件 path/to/file.txt

请参阅man git-rev-parse以获取可能的修订说明(当然,简单的哈希(如dd9bacb)会很好地完成)

别忘了提交更改(经过审核...)


15
哇,@ heneryville和sehe,我实际上以为“ 7天前”是meta,因为您可以弄清楚是什么提交。ty!
AnneTheAgile 2014年

7
第2部分当希望选择特定提交时,上述格式不起作用。而是使用Urs下方显示的内容,git checkout commitShaNumber-每个stackoverflow.com/questions/215718/…的
/file.txt

2
@AnneTheAgile其实这仍然完全一样的语法,我刚好给的一个“复杂”的例子revision-specification,因为这是该任择议定书要求:)
sehe

1
如果您使用提交来删除要恢复的文件,则只需使用shacommit~1(ex git checkout 0f4bbdcd~1 -- path/to/file.txt:)即可立即获得提交。
sdlins

89
  1. 通过检出旧提交中的文件git checkout [Revision_Key] -- path/to/file
  2. 根据需要添加,提交,推送。

3
git checkout可以处理单个文件(请参见sehe的答案),无需复制和粘贴。
Koraktor 2011年

1
修订密钥是否始终是提交的SHA1?
IslandCow 2011年

1
它们是,但是通常SHA1的前6到8个字符足以识别修订。
Urs Reupke '10

2
@IslandCow没有,他们可以是SHA1而且分支,标签,或其他任何东西,点提交,例如HEADORIG_HEAD或任何与那些结合^/ ~/ @风格的符号。
阿洛瓦·马哈德

2
您指示应该在以后“添加”文件。但这是不正确的。该文件未放置在暂存区域中。它已经被添加。
xApple

8

我需要恢复提交到git中的最新文件。因此,只需重申一下并给出另一种观点,您需要通过运行以下两个步骤来做到这一点:

  1. git log -3
    这显示了三个最近的提交。阅读评论和作者的姓名,以便缩小所需的确切版本。写下您想要的提交版本的长提交ID(即b6b94f2c19c456336d60b9409fb1e373036d3d71)。

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71-myfile.java
    传递提交ID和要还原的文件名。确保双连字符前后都有空格。

还有许多其他方法可以做到这一点。但这是我记得较简单的一个。希望能有所帮助。

注意:如果您位于项目路径/文件夹中,则无需在checkout命令中键入完整文件的路径。


有史以来最好的评论。因为这是一个已接受的答案,所以假定必须提取的文件被推到上游,但是此命令将提取/恢复仅本地存在的文件。
ot0

1
刚在我本地git repo的根文件夹中尝试过此操作。我仍然需要提供文件的相对路径。仅提供-[文件名]无效。
user2784627

@ ot0不,它不假定那样。他们是完全相同的答案。
马特

4

所有答案都提及git checkout <tree-ish> -- <pathspec>。从git v2.23.0开始,有一个新的git restore方法,应该假定它git checkout负责其中的一部分。在github博客上查看更改的要点。

此命令的默认行为是使用来自source参数的内容(在您的情况下为提交哈希)恢复工作树的状态。

假设提交哈希为abcdef以下命令:

git restore --source=abcdef file_name

(默认情况下)将其放入工作树中。如果要直接将更改放入索引中,以便可以立即提交:

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

或使用简短的选项名称:

git restore -s=abcdef -W -S file_name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.