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 从丢失的提交中恢复

如果你回退到了过去的某个提交并丢失了更新的提交,可以通过以下步骤恢复丢失的提交:

  1. 运行以下命令查看引用日志:
git reflog
  1. 找到丢失的提交,然后通过以下命令回退到它:
git reset HEAD --hard <sha1-of-commit>

18.4 恢复已提交删除的文件

如果你不小心提交了文件的删除操作,后来意识到你需要恢复该文件,可以按照以下步骤操作:

  1. 使用以下命令找到删除文件的提交 ID:
git log --diff-filter=D --summary

此命令将按顺序显示删除文件的提交摘要。

  1. 恢复文件:
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 垃圾收集器删除了没有引用的悬挂提交,你将无法恢复已删除的分支。始终备份你的仓库,特别是在小型团队或专有项目中工作时。