课程 29 · 恢复
使用 reflog 查找丢失的提交
在本地引用日志中找到硬重置留下的提交,在信任它之前检查其文件,然后在其上放置一个分支,而不移动当前的签出。
- 级别: 高级
- 阅读 2 分钟
- 5 分钟的视频
- 已更新
- 在这节课之前: 重置:软重置、混合重置和硬重置
进度已保存在此浏览器中。
播放时会加载来自 YouTube 的视频(隐私增强模式)。
你将学到什么
- 读取引用日志作为此存储库的 HEAD 和分支所在位置的记录。
- 在救援之前检查候选提交的内容。
- 在测量的提交处创建一个分支,而不将其签出。
- 说说引用日志无法恢复的内容:未提交的工作和过期的条目。
开始之前
您位于 private/lost-signup,这是第 18 课结果 M 的一个分支。您提交了一条注释“docs:保留注册恢复注释”,其中添加了 docs/signup-recovery.md,然后运行了一次硬重置一次提交。该注释已从分支、图表和文件中消失。您还没有救援分支,并且您没有更改任何其他内容。
一切都是本地的并且采用免费套餐(GitTree 要求您登录):没有托管帐户、没有提供商、没有互联网。每个身份都是虚构的(example.com)。切勿在实际项目中运行本课程。准备工作中的硬重置是一次性副本中的排练。
在 GitTree 中或使用本机 Git 命令进行更改,而不是在同一副本中进行更改。读取结果总是安全的。菜单标签来自 GitTree 2.0 自己的字符串,本机命令使用 Git 2.43 在一次性副本中运行。 GitTree 步骤未在 macOS、Windows 或 Linux 上运行。
概念和状态效应
裁判日志是裁判运动的本地日记。 HEAD 有一个,每个分支也有一个。它记录“提交”、“签出”、“重置”等,以及每个提交的提交。另一个克隆人没有你的日记。没有分支名称仍然可以存在的提交,并且引用日志就是您找到它的方式。
像 HEAD@{1} 这样的选择器会从现在开始计算条目,因此它们会随着以后的每次操作而变化。使用前请阅读候选人的动作、时间、ID和档案。不要将偏移量作为配方来记忆。
reflog 查找已保存的提交。正如第 27 课所示,它找不到从未提交的编辑。条目过期:默认情况下,Git 会将没有分支到达的提交条目保留大约三十天,并且存储库可以更改这一点。恢复时不要运行清理或过期命令。
在提交时创建一个分支会添加一个引用,而不会添加任何其他内容。当前分支、索引和文件保留在原来的位置。
准备准确的项目状态
从第 18 课结果 M 的单独普通副本开始,并保持原件不变。创建分支,保存 DOC_LOST,提交它并硬重置一次提交。这种破坏性准备仅适用于一次性副本。
完整的文件输入
仅在下面指定的阶段保存。这些是完整的 UTF-8/LF 正文,最后有换行符;永远不要粘贴 Markdown 栅栏。未更改的可运行文件继承命名输入。单独变体中的版本不得覆盖原始版本。
docs/signup-recovery.md — DOC_LOST
# Recovered signup work
Keep a branch name before leaving useful experimental work.在GitTree
使用 Command+Shift+P(在 Ubuntu 上为 Ctrl+Shift+P)打开调色板。
- 按照下一节所示进行排练,并记下丢失提交的主题。
- 打开调色板并运行 View Reflog…。对话框“Reflog”打开,其中 Reflog of 设置为 HEAD;条目首先列出最新的。
- 阅读最上面的条目。最新的说“重置”,下面的说“提交”,主题是“文档:保留注册恢复说明”。如果列表很长,请使用 Show Older Entries。不要假设第二行总是正确的。
- 选择提交条目。该对话框显示 Show in Graph 和 New branch name。 Show in Graph 只能放置分支到达的提交,因此对于这个丢失的提交,它会关闭对话框,并且图表保持在 M:重新打开下一步的引用日志。恢复提交后,您将读取该提交的文件。
- 返回对话框,选择同一条目,在 New branch name 中键入
rescue/signup,然后选择 Restore as Branch。该通知显示“已创建分支救援/注册。撤消操作将再次将其删除。” - 检查结果:
rescue/signup指向丢失的提交,当前分支仍然是M上的private/lost-signup,并且您的文件没有变化。选择恢复的提交并打开其文件docs/signup-recovery.md:它是 DOC_LOST。 - 将救援分支留在原处。不要运行任何清理来整理图表。
对于课程中的每个普通提交:Summary 是规定的主题,Description 为空,并且选项 Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit 和 Allow Empty Commit 保持关闭状态。
在航站楼
仅在第 18 课结果的单独、干净的副本中:
git switch --create private/lost-signup将 DOC_LOST 保存为 docs/signup-recovery.md,然后:
git add -- docs/signup-recovery.md
git commit --quiet -m "docs: keep the signup recovery note"
git reset --hard HEAD~1
git reflog show --format=%gs -2 HEADreset: moving to HEAD~1
commit: docs: keep the signup recovery note列出候选人及其 ID,并检查您认为丢失的候选人:
git reflog show --format='%H %gs' HEAD
git show "<lost-sha>:docs/signup-recovery.md"将 <lost-sha> 替换为“commit:docs:保留注册恢复说明”行中的 ID。在这个直接示例中,HEAD@{1} 是相同的提交,但该偏移量不是规则。创建救援分支而不检出它:
git branch rescue/signup "<lost-sha>"
git show rescue/signup:docs/signup-recovery.md
git symbolic-ref --short HEAD
git status --short文件为DOC_LOST,打印的分支为private/lost-signup,状态为空。您的文件不会显示注释,因为 HEAD 保留在 M 上。其中没有到期或清理命令。
结果
Where you end: rescue/signup 指向丢失的提交,其文件为 DOC_LOST。当前分支、索引和文件与重置后完全相同,并且没有推送任何内容。
常见错误
- 使用
HEAD@{1}作为固定配方,而不是读取条目。 - 在保存分支之前再次重置或签出,这会添加更多条目并隐藏您想要的条目。
- 期望引用日志保存从未提交的编辑。
- 在查找某些内容时运行清理命令。
如果出现问题
如果提交不在列表中,您可能会看到错误的引用:在 HEAD 和分支之间切换 Reflog of,并使用 Show Older Entries。如果它确实消失了,则它已过期或从未提交。在应用程序中,Restore as Branch 之后的通知表示撤消会再次删除分支。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
正确回答所需的问题以完成课程。
在此浏览器中检查。
练习
报告两个最新的引用日志行、丢失提交的 ID、恢复文件的第一行以及您签出所在的分支。然后说出对于您从未提交的编辑,引用日志将显示什么。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- 裁判日志是裁判动作的本地日记。
- 检查候选者,然后从中分支。
- 它查找提交,而不是未保存的编辑。
有关的
术语表介绍
Reflog — Reflog;救援分支 — فר فٸ;选择器 — ÐÐِّð。
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 提交似乎消失了。 Git 还记得 它在哪里。
- reflog 是 HEAD 所在的本地日记 和分支机构已经。
- 没有分支名称的提交仍然可以 列于其中。
- 在一次性副本中:提交注释,并且 然后硬重置它。
- 图中只显示了M。注释是 无处可见。
- 现在不要重置或清理。先看一下。
- 打开调色板,然后运行查看引用日志。
- 对话框在 HEAD 上打开。最新举动 是第一。
- 最新行是重置。就在它下面 是丢失的提交。
- 如果列表很长,则显示较旧的条目。
- 您可以在 HEAD 和 分支。
- 一次不要记住 HEAD。阅读条目 相反。
- 选择提交条目。新选择 出现。
- 在图表中显示无法放置它: 没有分支到达此提交。
- 所以首先将其恢复为分支, 然后读取它的文件。
- 返回并选择相同的条目。
- 将分支命名为救援斜杠注册。
- 将其恢复为分支。通知说 撤消会再次删除它。
- 救援分支位于丢失的提交上。 你还在M。
- 你的文件没有改变。
- 在航站楼中,最新的两条线路是 重置和提交。
- 通过 ID,我们可以按行选择提交。
- git show 带有路径读取文件 那个承诺。
- git 分支创建救援分支。我们的 结帐保持不变。
- 状态为空,文件安全 在树枝上。
- 从未提交的编辑不存在于 重新记录。
- 条目过期。不要运行清理 你康复了。
- 这是本地的。其他克隆没有你的 日记。
- 练习:报告线路、ID、 第一行和分支。
- 接下来是GitTree自己的撤消和重做。