乐闻世界logo
搜索文章和话题

Git 如何将文件重置或还原为特定的提交版本?

9 个月前提问
5 个月前修改
浏览次数100

6个答案

1
2
3
4
5
6

重置或恢复文件到特定版本的方法通常取决于您是如何管理和存储这些文件的。以下是几种常见的文件管理环境及其对应的重置或恢复方法:

版本控制系统(如Git)

  1. 查找特定版本的提交哈希或标签

    sh
    git log

    使用 git log 命令查看提交历史,找到您想要重置到的特定版本的提交哈希或标签。

  2. 重置到特定版本

    sh
    git reset --hard <commit-hash>

    将您的HEAD指针(当前分支)重置到特定的提交。注意,这会丢弃所有当前分支上该提交之后的更改。

  3. 检出特定版本的文件

    sh
    git checkout <commit-hash> -- <file-path>

    如果您只想恢复某个特定文件的旧版本,可以使用这个命令。

备份和还原系统

如果您有定期备份的习惯,可以通过备份系统恢复文件:

  1. 访问备份: 找到包含所需文件版本的备份。
  2. 选择文件: 选定需要恢复的文件或文件夹。
  3. 恢复: 使用备份系统的恢复功能将文件恢复到特定的版本。

云存储服务(如Dropbox, Google Drive)

这些服务通常会保留文件编辑的历史记录,并允许您恢复到旧版本:

  1. 查找文件版本历史 在文件上点击右键,选择查看版本历史,或者查找服务提供的“版本历史”选项。

  2. 选择版本并恢复 找到您想要的文件版本,通常会有一个恢复或回滚的选项允许您将文件恢复到那个版本。

文件系统快照(如Windows的“上一个版本”)

在某些操作系统中,您可以利用内置的文件历史或快照功能:

  1. 访问属性: 右键文件或文件夹,选择“属性”。
  2. 找到上一个版本: 在属性菜单中找到“上一个版本”或“历史记录”标签页。
  3. 选择并恢复: 选择列表中的一个版本,然后点击“恢复”。

手动复制

如果没有使用上述任何系统,但您手动地定期保存文件的不同版本,那么您只需要找到所保存的那个版本的文件,并替换掉当前的文件。

提醒

在进行任何重置或恢复操作之前,请确保备份您当前的工作,以免丢失数据。如果您不确定如何操作,或者没有足够的经验,请先在非生产环境中练习,或者咨询经验丰富的同事或专业人士。

2024年6月29日 12:07 回复

假设您想要的提交的哈希值是c5f567

shell
git checkout c5f567 -- file1/to/restore file2/to/restore

git checkout手册页提供了更多信息。

如果您想恢复到之前的提交c5f567,请追加~1(其中 1 是您要返回的提交数,可以是任何值):

shell
git checkout c5f567~1 -- file1/to/restore file2/to/restore

附带说明一下,我一直对这个命令感到不舒服,因为它既用于普通的事情(在分支之间进行更改),也用于不寻常的破坏性事情(丢弃工作目录中的更改)。

--命令中的含义可以参考在Git中,--(dash dash) 是什么意思?


还有一个新git restore命令专门用于恢复已修改的工作副本文件。如果你的 git 足够新,你可以使用这个命令,但文档附带一个警告:

该命令是实验性的。行为可能会改变。

因为git restore它是实验性的,所以还不应该被推广为这个问题的主要答案。当该命令不再标记为“实验性”时,则可以修改此答案以推广git restore. [在撰写本文时,该git restore命令已被标记为“实验”至少四年。]

2024年6月29日 12:07 回复

您可以使用 diff 命令快速查看对文件所做的更改:

shell
git diff <commit hash> <filename>

然后要将特定文件恢复到该提交,请使用重置命令:

shell
git reset <commit hash> <filename>

--hard如果您有本地修改,您可能需要使用该选项。

管理航路点的一个好的工作流程是使用标签在时间轴中清晰地标记点。我不太明白你的最后一句话,但你可能想要的是从之前的时间点分出一个分支。为此,请使用方便的结帐命令:

shell
git checkout <commit hash> git checkout -b <new branch name>

当您准备好合并这些更改时,您可以根据主线重新调整基础:

shell
git checkout <my branch> git rebase master git checkout master git merge <my branch>
2024年6月29日 12:07 回复

您可以使用对 git 提交的任何引用,包括 SHA-1(如果最方便的话)。重点是该命令如下所示:

git checkout [commit-ref] -- [filename]

2024年6月29日 12:07 回复

git checkout -- foo

这将重置foo为 HEAD。你也可以:

shell
git checkout HEAD^ foo

进行一次修订等

2024年6月29日 12:07 回复

从 git v2.23.0 开始,有一个新的git Restore方法,该方法应该承担部分git checkout责任(即使接受的答案也提到这git checkout非常令人困惑)。请参阅github 博客上的更改要点。

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

因此,根据 Greg Hewgill 的回答(假设提交哈希为c5f567),命令将如下所示:

shell
git restore --source=c5f567 file1/to/restore file2/to/restore

或者如果你想恢复到c5f567之前一次提交的内容:

shell
git restore --source=c5f567~1 file1/to/restore file2/to/restore
2024年6月29日 12:07 回复

你的答案