ChatGPT解决这个技术问题 Extra ChatGPT

从 git 中的旧提交恢复文件

我有一个几周前做的旧提交。我只想从该提交中恢复一个文件。我该怎么办?


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

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

有关可能的修订规范,请参见 man git-rev-parse(当然,简单的散列(如 dd9bacb)会很好)

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


哇,@heneryville 和 sehe,我实际上认为“7 天前”是元数据,因为你会弄清楚什么提交。泰!
第 2 部分 当希望选择特定的提交时,上述格式不起作用。而是使用 Urs 下面显示的内容, git checkout commitShaNumber -- path/to/file.txt per stackoverflow.com/questions/215718/…
@AnneTheAgile 实际上这仍然是完全相同的语法,我只是碰巧给出了一个 revision-specification 的“复杂”示例,因为这是 OP 所要求的:)
如果您的提交用于删除您要恢复的文件,只需使用 shacommit~1(例如:git checkout 0f4bbdcd~1 -- path/to/file.txt)即可在之前立即获取该提交。
老实说,我认为“7天前”位是提交哈希码。
K
Kevin Reid

通过 git checkout [Revision_Key] -- path/to/file 从旧提交中签出文件。酌情添加、提交、推送。


git checkout可以处理单个文件(参见sehe的回答),无需复制和粘贴。
修订密钥是否始终是提交的 SHA1?
它们是,但通常 SHA1 的前 6 到 8 个字符足以识别修订版。
@IslandCow 不,它们可以是 sha1,也可以是分支、标签或任何其他指向提交的东西,例如 HEADORIG_HEAD 或任何与 ^/~/@ 结合的东西风格的符号。
您表示应该在之后“添加”该文件。但这是不正确的。该文件未放置在暂存区域中。它已经添加了。
M
Marc L.

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

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

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

git restore --source=abcdef file_name

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

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

或使用短选项名称:

git restore -sabcdef -W -S file_name

这肯定现在应该成为公认的答案,因为它使其他答案几乎过时了。
N
NelsonGon

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

git log -3 这显示了三个最近的提交。阅读评论和作者姓名,以便缩小您想要的确切版本。为您想要的提交版本写下那个长提交 ID(例如 b6b94f2c19c456336d60b9409fb1e373036d3d71)。 git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 -- myfile.java 传递提交 ID 和要恢复的文件名。确保双连字符前后都有空格。

还有很多其他方法可以做到这一点,但这是我能记住的最简单的一种。

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


有史以来最好的评论。因为这是公认的答案,假设必须获取的文件被推送到上游,但是此命令获取/恢复仅存在于本地的文件。
刚刚在我的本地 git repo 的根文件夹中尝试了这个。我仍然需要提供文件的相对路径。仅提供 -- [filename] 是行不通的。
@ot0 不,它不假设。它们是完全相同的答案。