18.1 从重置中恢复
在 Git 中,你几乎可以随时回溯时间。
不要害怕使用会重写历史的命令。默认情况下,Git 不会删除你的提交 90 天,而是在这段时间内,你可以轻松从引用日志中恢复它们:
$ git reset @~3 # 回退 3 个提交
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... 更早的提交 ...
$ git reset 2c52489
... 你现在回到了起点
注意:要小心使用 --hard 和 --force 等选项——它们可能会丢弃数据。
此外,在协作的分支上避免重写历史。
18.2 从 git stash 中恢复
运行 git stash 后,使用以下命令获取你最近的暂存内容:
git stash apply
要查看你的暂存列表,使用:
git stash list
你会得到一个类似以下的列表:
stash@{0}: WIP on master: 67a4e01 Merge tests into develop
stash@{1}: WIP on master: 70f0d95 Add user role to localStorage on user login
使用显示在你想要恢复的暂存旁边的编号:
git stash apply stash@{2}
你也可以选择 git stash pop,它与 git stash apply 类似:
git stash pop
或者
git stash pop stash@{2}
git stash apply 和 git stash pop 的区别:
git stash pop:暂存数据将从暂存列表中移除。
例如:
git stash list
你会得到一个类似以下的列表:
stash@{0}: WIP on master: 67a4e01 Merge tests into develop
stash@{1}: WIP on master: 70f0d95 Add user role to localStorage on user login
使用命令 git stash pop 弹出暂存数据:
git stash pop
再次检查暂存列表:
git stash list
你会得到一个类似以下的列表:
stash@{0}: WIP on master: 70f0d95 Add user role to localStorage on user login
你可以看到一个暂存数据从暂存列表中移除(弹出),stash@{1} 变成了 stash@{0}。
18.3 从丢失的提交中恢复
如果你回退到了过去的某个提交并丢失了更新的提交,可以通过以下步骤恢复丢失的提交:
- 运行以下命令查看引用日志:
git reflog
- 找到丢失的提交,然后通过以下命令回退到它:
git reset HEAD --hard <sha1-of-commit>
18.4 恢复已提交删除的文件
如果你不小心提交了文件的删除操作,后来意识到你需要恢复该文件,可以按照以下步骤操作:
- 使用以下命令找到删除文件的提交 ID:
git log --diff-filter=D --summary
此命令将按顺序显示删除文件的提交摘要。
- 恢复文件:
git checkout <sha1-of-commit>~1 <your-lost-file-name>
将 <sha1-of-commit> 替换为你的提交 ID。
18.5 恢复文件到之前的版本
要将文件恢复到之前的版本,可以使用 reset:
git reset <sha1-of-commit> <file-name>
如果你已经对文件进行了本地更改(你不需要这些更改),也可以使用 --hard 选项。
18.6 恢复已删除的分支
要恢复已删除的分支,你需要通过运行以下命令找到已删除分支的头部提交:
git reflog
然后,通过以下命令重新创建分支:
git checkout -b <branch-name> <sha1-of-commit>
如果你的 Git 垃圾收集器删除了没有引用的悬挂提交,你将无法恢复已删除的分支。始终备份你的仓库,特别是在小型团队或专有项目中工作时。