Git Reflog
最后更新
git reflog 记录 HEAD 指向过的每一个位置:每次提交、检出、reset 和 rebase。即使提交已经不在任何分支上,Git 也会把它们保留一段时间,所以 reflog 就是你的安全网:执行 reset --hard、变基出错或误删分支之后,那些看似丢失的工作都能通过它找回来。
在终端在线编辑器中试试这些命令:浏览器里就是真正的 shell,无需安装。
语法
| 命令 | 作用 |
|---|---|
git reflog | 显示 HEAD 最近的位置及其哈希值 |
git reflog show <branch> | 显示某个分支的 reflog |
git reset --hard HEAD@{1} | 让 HEAD 跳回之前的某个位置 |
git branch recovered <hash> | 在丢失的提交上重新创建分支 |
出错后恢复
找到 reset 之前的提交,撤销一次错误的 reset。
| 步骤 | 命令 | 结果 |
|---|---|---|
| 1 | git reflog | 找到 reset 之前的那个提交 |
| 2 | git reset --hard HEAD@{1} | 把分支恢复到那个提交 |
git reflog 常见问题
git reflog 是什么?
它是一份日志,记录本地仓库里
HEAD(以及每个分支的末端)指向过的所有位置,包括提交、检出、reset、合并和变基之后的位置。git log 沿着提交的祖先关系展示历史,而 reflog 是按时间顺序记录你的操作,这正是它能用来恢复数据的原因。git reset --hard 之后怎么找回提交?
运行
git reflog,找到 reset 之前所在提交对应的条目(类似 HEAD@{1}),然后运行 git reset --hard <that-hash>(或 HEAD@{1})回到那里。那个提交并没有真正被删除,只是没有分支指向它了,而 reflog 仍然记得它的哈希值。怎么恢复已删除的分支?
在
git reflog 中找到该分支的最后一个提交,然后在那里重新创建分支:git branch <name> <hash>。只要删除是最近发生的(在 Git 的 reflog 过期时间之内,通常是几周),这些提交都还能这样找回。git reflog 在不同的克隆之间通用吗?
不通用。reflog 只存在于你的本地仓库,不会被推送或克隆,它只记录你这台电脑上的操作。所以它能挽救本地的失误,却无法找回只在别的克隆里存在过的内容。
可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里的真实 shell 中运行
git reflog,无需安装。Coddy 的免费互动 Git 课程也会一步步教你撤销更改和恢复数据。