第 3 课:历史查看与文件恢复
本课目标:
- 用
git log阅读提交历史。- 通过哈希识别一次提交。
- 用
git restore找回文件的早期版本。先修条件:第 1-2 课(存档点、
git init、git add、git commit) | 上一篇 << 02 | 下一篇 04 >>
如果昨天的版本更好呢?
你做了一次提交,然后又改了文件。现在你发现新版本更差,想要回旧版本。
Git 会永久保存每一次提交。每次提交都有一个唯一的哈希:一长串字母和数字,充当这次提交的 ID。用 git log 可以看到提交列表 1。只要知道目标提交的哈希,你就可以让 Git 把某个文件恢复成那次提交时的样子。
阅读时间线
在你的 git-practice 文件夹里运行 git log,你会看到类似这样的输出:
commit 后面那串长字符就是哈希。你不需要输入完整的一串;只要前几个字符不和别的提交重复,通常就足以指定它。
git log 按时间列出提交,最新的在最上面。最上面那条就是你当前所在的提交。
恢复旧版本
命令 git restore --source=<hash> <file> 会用那次提交里的版本替换当前文件。最常用的 source 是 HEAD,意思是 “当前提交”;或者 HEAD~1,意思是 “当前提交的前一个” 2。
运行之后,用文本编辑器打开 draft.txt,它应该显示旧版本的内容。
安全提醒: git restore 会改动工作目录里的文件。如果你有在意的未提交改动,先提交它们,或者在仓库之外留一份副本。
完整示例(跟着做)
留在你的 git-practice 文件夹里。
如果 git log --oneline 只显示一次提交,HEAD~1 还不存在。先按第 2 课做出两次提交,或者现在补一次提交,再来做这一步。
你来试试(填空示例)
补全命令,找回 notes.txt 在两次提交之前的版本。
答案:
常见错误拆解
错误: 运行 git restore --source=HEAD~1 file.txt 之后,以为自己改写了历史。并没有。你只是把一个旧版本复制进了工作目录,原来那次提交仍然在历史里。如果想保留恢复出来的版本,你必须重新暂存并提交它。
小结 + 下节课预告
你现在能阅读仓库的历史,也能找回文件的早期版本。四项核心技能已经掌握两项。接下来,你将学习用分支安全地做实验。
Footnotes
-
Pro Git, Recording Changes to the Repository — https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository ↩
-
Git User Manual — https://git.github.io/htmldocs/user-manual.html ↩