从git中的旧提交恢复文件

Var*_*har 173 git git-checkout

几周前我做了一个旧的提交.我想从该提交中仅恢复单个文件.我该怎么办?

seh*_*ehe 200

git checkout 'master@{7 days ago}' -- path/to/file.txt
Run Code Online (Sandbox Code Playgroud)

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

请参阅man git-rev-parse以获取可能的修订规范(当然,简单的哈希(如dd9bacb)会做得很好)

不要忘记提交更改(审核后......)

  • 哇,@heneryville和sehe,我实际上认为'7天前'是因为你会想出什么提交.TY! (13认同)
  • 第2部分当希望选择特定提交时,上述格式不起作用.而是使用Urs在下面显示的内容,git checkout commitShaNumber - path/to/file.txt per http://stackoverflow.com/questions/215718/how-do-i-reset-revert-a-specific-file-to-一个特定的修订版本 - 使用 - 混帐 (6认同)
  • 事实上@AnneTheAgile仍然是完全相同的语法,我碰巧给出了一个"复杂"的例子[`revision-specification`](http://www.kernel.org/pub/software/scm/git/docs /git-rev-parse.html)因为那是OP问的:) (2认同)
  • 如果您的提交用于删除您尝试恢复的文件,只需使用“shacommit~1”(例如:“git checkout 0f4bbdcd~1 -- path/to/file.txt”)即可获取之前的提交。 (2认同)

Urs*_*pke 83

  1. 通过旧的提交检出文件git checkout [Revision_Key] -- path/to/file.
  2. 适当添加,提交,推送.

  • `git checkout`可以处理单个文件(见sehe的回答),无需复制和粘贴. (3认同)
  • @IslandCow 不,它们可以是 sha1,也可以是分支、标签或任何其他指向提交的东西,例如 `HEAD`、`ORIG_HEAD` 或任何与 `^`/`~`/`@` 组合的东西-样式符号。 (2认同)
  • 您表示之后应该"添加"该文件.但这是不正确的.该文件未放置在暂存区域中.它已经添加了. (2认同)

mja*_*sie 22

所有答案都提到git checkout <tree-ish> -- <pathspec>。从 git v2.23.0 开始,有一个新的git restore方法应该承担部分git checkout责任。请参阅github 博客上的更改亮点。

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

假设提交哈希是abcdef命令,如下所示:

git restore --source=abcdef file_name
Run Code Online (Sandbox Code Playgroud)

它(默认情况下)将它放在工作树中。如果您想将更改直接放在索引中以便可以立即提交:

git restore --source=abcdef --worktree --staged file_name
Run Code Online (Sandbox Code Playgroud)

或使用简短的选项名称:

git restore -s=abcdef -W -S file_name
Run Code Online (Sandbox Code Playgroud)

  • 现在这肯定应该成为公认的答案,因为它使其他答案几乎过时了。 (6认同)

Sal*_*cia 5

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

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

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

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

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