跳至内容
GitTree

课程 29 · 恢复

使用 reflog 查找丢失的提交

在本地引用日志中找到硬重置留下的提交,在信任它之前检查其文件,然后在其上放置一个分支,而不移动当前的签出。

进度已保存在此浏览器中。

播放时会加载来自 YouTube 的视频(隐私增强模式)。

英文旁白 · English and Arabic 字幕

打开视频页面在 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)打开调色板。

  1. 按照下一节所示进行排练,并记下丢失提交的主题。
  2. 打开调色板并运行 View Reflog…。对话框“Reflog”打开,其中 Reflog of 设置为 HEAD;条目首先列出最新的。
  3. 阅读最上面的条目。最新的说“重置”,下面的说“提交”,主题是“文档:保留注册恢复说明”。如果列表很长,请使用 Show Older Entries。不要假设第二行总是正确的。
  4. 选择提交条目。该对话框显示 Show in Graph 和 New branch name。 Show in Graph 只能放置分支到达的提交,因此对于这个丢失的提交,它会关闭对话框,并且图表保持在 M:重新打开下一步的引用日志。恢复提交后,您将读取该提交的文件。
  5. 返回对话框,选择同一条目,在 New branch name 中键入 rescue/signup,然后选择 Restore as Branch。该通知显示“已创建分支救援/注册。撤消操作将再次将其删除。”
  6. 检查结果:rescue/signup指向丢失的提交,当前分支仍然是M上的private/lost-signup,并且您的文件没有变化。选择恢复的提交并打开其文件 docs/signup-recovery.md:它是 DOC_LOST。
  7. 将救援分支留在原处。不要运行任何清理来整理图表。

对于课程中的每个普通提交:Summary 是规定的主题,Description 为空,并且选项 Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit 和 Allow Empty Commit 保持关闭状态。

在航站楼

仅在第 18 课结果的单独、干净的副本中:

Command · bash
git switch --create private/lost-signup

将 DOC_LOST 保存为 docs/signup-recovery.md,然后:

Command · bash
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 HEAD
输出
reset: moving to HEAD~1
commit: docs: keep the signup recovery note

列出候选人及其 ID,并检查您认为丢失的候选人:

Command · bash
git reflog show --format='%H %gs' HEAD
git show "<lost-sha>:docs/signup-recovery.md"

将 <lost-sha> 替换为“commit:docs:保留注册恢复说明”行中的 ID。在这个直接示例中,HEAD@{1} 是相同的提交,但该偏移量不是规则。创建救援分支而不检出它:

Command · bash
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 之后的通知表示撤消会再次删除分支。

检查你的理解情况

回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。

  1. 第 1 题,共 6 题

    什么是重新记录?

    选择一个答案。

  2. 第 2 题,共 6 题

    转发日志中哪些是真实的?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    您在引用日志中找到了丢失的提交,并使用名称为 rescue/signup 的“恢复为分支”。你看到了什么?

    选择一个答案。

  4. 第 4 题,共 6 题

    更改输入:您从未提交过注释,然后运行了硬重置。 reflog 可以恢复吗?

    选择一个答案。

  5. 第 5 题,共 6 题
    必填

    您又执行了一些操作,然后运行了 git branch rescue HEAD@{1},但该文件不是您想要的文件。发生了什么?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    创建救援分支后,哪些回读表明它按照课程所述工作?

    选择每个适用的答案。

0 个(共 6 个)正确

正确回答所需的问题以完成课程。

在此浏览器中检查。

练习

报告两个最新的引用日志行、丢失提交的 ID、恢复文件的第一行以及您签出所在的分支。然后说出对于您从未提交的编辑,引用日志将显示什么。

您自己的确认:该网站无法看到您的计算机。

要完成本课程,请正确回答所需的问题并确认实践练习。

回顾

  • 裁判日志是裁判动作的本地日记。
  • 检查候选者,然后从中分支。
  • 它查找提交,而不是未保存的编辑。

术语表介绍

Reflog — Reflog;救援分支 — فר فٸ;选择器 — ÐÐِّð。

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 提交似乎消失了。 Git 还记得 它在哪里。
  2. reflog 是 HEAD 所在的本地日记 和分支机构已经。
  3. 没有分支名称的提交仍然可以 列于其中。
  4. 在一次性副本中:提交注释,并且 然后硬重置它。
  5. 图中只显示了M。注释是 无处可见。
  6. 现在不要重置或清理。先看一下。
  7. 打开调色板,然后运行查看引用日志。
  8. 对话框在 HEAD 上打开。最新举动 是第一。
  9. 最新行是重置。就在它下面 是丢失的提交。
  10. 如果列表很长,则显示较旧的条目。
  11. 您可以在 HEAD 和 分支。
  12. 一次不要记住 HEAD。阅读条目 相反。
  13. 选择提交条目。新选择 出现。
  14. 在图表中显示无法放置它: 没有分支到达此提交。
  15. 所以首先将其恢复为分支, 然后读取它的文件。
  16. 返回并选择相同的条目。
  17. 将分支命名为救援斜杠注册。
  18. 将其恢复为分支。通知说 撤消会再次删除它。
  19. 救援分支位于丢失的提交上。 你还在M。
  20. 你的文件没有改变。
  21. 在航站楼中,最新的两条线路是 重置和提交。
  22. 通过 ID,我们可以按行选择提交。
  23. git show 带有路径读取文件 那个承诺。
  24. git 分支创建救援分支。我们的 结帐保持不变。
  25. 状态为空,文件安全 在树枝上。
  26. 从未提交的编辑不存在于 重新记录。
  27. 条目过期。不要运行清理 你康复了。
  28. 这是本地的。其他克隆没有你的 日记。
  29. 练习:报告线路、ID、 第一行和分支。
  30. 接下来是GitTree自己的撤消和重做。