跳至内容
GitTree

课程 26 · 恢复

隐藏工作并安全地恢复它

将未完成的编辑和新注释用 stash 放在一边,用 Apply 将它们带回来,然后看看 Pop 在发生冲突时会做什么:stash 会一直保留,直到您做出决定。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 YouTube 上观看

你将学到什么

  • 选择存储的内容:跟踪的编辑、未跟踪的文件或仅暂存的文件。
  • 解释为什么Apply会保留隐藏的内容,而Pop只有在干净应用后才将其删除。
  • 验证编辑和注释均已返回且分支未移动。
  • 从流行冲突中恢复而不丢失藏匿物。

开始之前

您位于 private/stash-hint,这是第 18 课结果的一个分支,其中一次提交添加了 docs/stash-conflict.md(“使用虚构地址。”)。在您的工作树中,您对该文件有一个未完成的编辑,并且有一个 Git 从未见过的新文件 docs/signup-hint.md。有人要求你换做其他事情,所以你想把两者都放在一边,不要做半途而废的工作。

一切都是本地的并且采用免费套餐(GitTree 要求您登录):没有托管帐户、没有提供商、没有互联网。每个身份都是虚构的(example.com)。切勿在实际项目中运行本课程。

在 GitTree 中或使用本机 Git 命令进行更改,而不是在同一副本中进行更改。读取结果总是安全的。菜单标签来自 GitTree 2.0 自己的字符串,本机命令使用 Git 2.43 在一次性副本中运行。 GitTree 步骤未在 macOS、Windows 或 Linux 上运行。

概念和状态效应

Stash 将本地更改存储为 Git 对象,然后将工作树清理回上次提交。它是一个短暂的中断工具,不是备份,也不是您想要保留的分支的替代品。

默认情况下,存储库保存跟踪的编辑。除非您要求,否则未跟踪的文件将被留下,Git 使用 --include-untracked 执行此操作。 GitTree 的 Stash Changes… 对话框在打开时已打开 Include untracked files;无论如何都要检查一下。忽略的文件是不同的类别,不会隐藏在这里。 Only staged changes 仅存储索引中的内容,而 Keep staged changes in place too 则保持索引不变。

Apply Stash 将更改放回并将隐藏内容保留在列表中。 Pop Stash 应用它并仅在应用干净时删除该条目。如果发生冲突,则存储会保留,并且您可以在工作树中解决冲突。 GitTree的Apply和Pop不会恢复暂存状态; git stash apply --index 会执行此操作,但应用程序不会使用它,因此暂存的编辑会以未暂存的方式返回。

隐藏和应用永远不会移动分支或进行提交。只有工作树和存储条目发生变化。

准备准确的项目状态

从第 18 课留下的项目的单独普通副本开始,并保持原始的 gittree-features 不变。创建分支,保存 DOC_STASH_BASE 并提交。然后将 DOC_STASH_WORK 保存在同一文件上,并将 DOC_HINT 保存为新文件,而不进行暂存。 DOC_STASH_OTHER 和 STASH_RESOLVED 仅在单独的冲突副本中使用。

完整的文件输入

仅在下面指定的阶段保存。这些是完整的 UTF-8/LF 正文,最后有换行符;永远不要粘贴 Markdown 栅栏。未更改的可运行文件继承命名输入。单独变体中的版本不得覆盖原始版本。

docs/stash-conflict.md — DOC_STASH_BASE

输出
Use a fictional address.

docs/stash-conflict.md — DOC_STASH_WORK

输出
Use a complete fictional email address.

文档/signup-hint.md — DOC_HINT

输出
Unfinished signup hint: use fictional data only.

文档/stash-conflict.md — DOC_STASH_OTHER

输出
Do not send the address anywhere.

文档/stash-conflict.md — STASH_RESOLVED

输出
Use a complete fictional email address. Nothing is sent.

在GitTree

使用 Command+Shift+P(在 Ubuntu 上为 Ctrl+Shift+P)打开调色板。隐藏条目列在左侧面板的 Stashes 下;储藏室的操作位于其右键菜单中。

  1. 构建分支和两个未暂存的更改,如下一节所示。阅读更改列表:docs/stash-conflict.md 已修改,docs/signup-hint.md 是新的。
  2. 打开调色板并运行 Stash Changes…。在对话框中将 Message 设置为 signup hint rehearsal。 Only staged changes 已关闭。 Include untracked files 已开启。 Keep staged changes in place too 已关闭。选择Stash。
  3. 等待“已隐藏您的更改”的通知。更改列表为空,注释已从磁盘中消失,并且存储显示在 Stashes 下。
  4. 将鼠标悬停在隐藏行上:其工具提示显示“包括未跟踪的文件”。右键单击它并选择 Show Stash:图表选择存储,右侧面板列出其跟踪的更改 docs/stash-conflict.md。未追踪的纸条被保存在储藏室的一个单独部分中。
  5. 再次右键单击它并选择 Apply Stash。通知上写着“已应用隐藏的物品;它仍在列表中。”
  6. 检查结果:docs/stash-conflict.md 再次被修改,docs/signup-hint.md 作为未跟踪文件返回,分支提示是相同的提交,并且存储仍然列出。
  7. Separate conflict copy. 在第二个副本中,在存储之后,将 DOC_STASH_OTHER 提交到同一文件。右键单击存储并选择 Pop Stash。警告说“存储与您的更改冲突:解决冲突。存储被保留。”
  8. 冲突的文件以 Conflicted 列出。打开它,在输出中写入 STASH_RESOLVED 并选择 Save and Mark Resolved。藏品还在那里。当您确定工作安全后,右键单击它并选择 Delete Stash…;该对话框表示它已从列表中删除并保留在恢复快照中。 GitTree 的撤消功能还不能恢复已删除的存储(第 30 课),因此将删除视为最终操作。

对于课程中的每个普通提交: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/stash-hint

将 DOC_STASH_BASE 保存为 docs/stash-conflict.md,然后:

Command · bash
git add -- docs/stash-conflict.md
git commit --quiet -m "docs: establish the stash conflict baseline"

将 DOC_STASH_WORK 保存为 docs/stash-conflict.md,并将 DOC_HINT 保存为 docs/signup-hint.md,而不进行暂存。然后把两者都藏起来:

Command · bash
git stash push --include-untracked --message "signup hint rehearsal"
git status --short
git stash list --format=%s
输出
On private/stash-hint: signup hint rehearsal

状态不打印任何内容:树是干净的。为冲突保留此状态的未更改副本,然后应用:

Command · bash
git stash apply 'stash@{0}'
git status --short
git stash list --format=%s
git rev-parse HEAD
输出
 M docs/stash-conflict.md
?? docs/signup-hint.md
On private/stash-hint: signup hint rehearsal

两个主体都回来了,存储仍然列出,并且 HEAD 是原来的提交。如果没有 --include-untracked,相同的推送会将 docs/signup-hint.md 保留在磁盘上并仅存储编辑内容。

在单独的副本中,保存 DOC_STASH_OTHER 并提交,然后弹出:

Command · bash
git add -- docs/stash-conflict.md
git commit --quiet -m "docs: change the stash target"
git stash pop 'stash@{0}'
git ls-files --unmerged
git stash list --format=%s

Pop 以 1 退出并打印“冲突(内容)”和“保留存储条目以备您再次需要时使用”。列出了三个未合并的条目,文件包含冲突标记,恢复了 docs/signup-hint.md,并且仍列出了存储。没有合并或变基可以继续:保存 STASH_RESOLVED 并运行 git add -- docs/stash-conflict.md。为了将工作停放在自己的分支上,git stash branch rescue-hint 'stash@{0}' 在进行存储的提交处创建分支,应用它,然后才删除存储。

结果

Where you end: 在第一个副本中,树再次进行了编辑和注释,HEAD 尚未移动,并且仍列出了存储。在冲突副本中,Pop 报告了冲突,藏品幸存下来,并且您的解决方案已上演。任何 stash 命令都没有进行提交,也没有推送任何内容。

常见错误

  • 忘记未跟踪的文件不会被隐藏,除非您包含它们。
  • 假设 Pop 在冲突后删除了存储。但事实并非如此。
  • 当第一次应用已经起作用时应用两次,然后想知道重复的更改。
  • 使用储藏室作为长期存储。说出一个分支的有用工作。

如果出现问题

发生 Pop 冲突后,将存储保留在原处,解析文件,并在删除任何内容之前检查结果。如果您申请了错误的分支,请仅在确认藏匿处仍保留该工作后才丢弃该工作。 Create Branch from Stash… 在提交时为存储提供了自己的分支。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    Pop Stash 能做什么而 Apply Stash 不能做什么?

    选择一个答案。

  2. 第 2 题,共 6 题

    您可以在启用“包括未跟踪的文件”的情况下运行“存储更改...”。其中哪些是正确的?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    存储后,您选择应用存储。你看到了什么?

    选择一个答案。

  4. 第 4 题,共 6 题

    更改输入:在副本中,在隐藏之前关闭“包括未跟踪的文件”。 docs/signup-hint.md 会发生什么情况?

    选择一个答案。

  5. 第 5 题,共 6 题
    必填

    在冲突副本中,Pop Stash 警告:“存储与您的更改发生冲突:解决冲突。存储被保留。”你担心工作没了。什么是真实的,你会做什么?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    在第一个副本中应用 Stash 后,哪些回读表明它按照课程所述起作用?

    选择每个适用的答案。

0 个(共 6 个)正确

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

在此浏览器中检查。

练习

证明存储后树是干净的,应用恢复了两个文件,并且存储仍然列出。预测如果 Include untracked files 关闭会有什么不同。在冲突副本中,证明藏品在流行中幸存下来。

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

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

回顾

  • 有目的地选择隐藏选项。
  • 应用保留该条目。
  • 矛盾的波普也保留了它。

术语表介绍

藏匿 — биби;申请 — Нибим;流行音乐——流行音乐;未追踪 — 详细信息。

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 把未完成的工作放在一边,然后带过来 安全回来。
  2. 一个储藏室将您的编辑保存在架子上,并且 清理工作树。
  3. 应用将更改恢复并保留 条目。如果干净的话,Pop 将其移除。
  4. 一次提交创建一个分支,然后编辑 文件并添加新注释。
  5. 在更改列表中:一个已修改的文件, 和一个新文件。
  6. 写下当前的提交。一定不能 移动。
  7. 打开调色板并运行 Stash Changes。
  8. 给它一条你能认出的信息。
  9. 仅上演已关闭。包括未跟踪的是 上。保持上演已关闭。
  10. 被忽略的文件是一个不同的类别, 并且不要进去。
  11. 选择Stash,然后等待通知。
  12. 更改列表为空,并且存储 已列出。
  13. 工具提示显示未跟踪的文件是 包括在内。 Show Stash 列出其文件。
  14. 右键单击存储,然后选择“应用” 藏起来。
  15. 通知称,藏品仍在 列表。
  16. 两者都回来了:编辑和注释。
  17. 分支提示是相同的提交。否 stash 命令做了一个。
  18. 而且藏品仍然在架子上。
  19. 在终端中, git stash push with 包括未跟踪,然后是状态。
  20. 该列表显示消息,其中 首先是分行名称。
  21. git stash apply 将两者都带回来。
  22. 存储仍然列出,并且 HEAD 是 一样。
  23. 如果没有该选项,注释将保留在 磁盘。
  24. 在冲突副本中,我们提交另一个 先改变,再流行。
  25. 警告称该藏品已被保留。的 文件有冲突。
  26. 解决该文件,并将其标记为已解决。 藏品还在那里。
  27. 仅当您确定时才删除存储。 或者给它自己的分支。
  28. 实践:证明清洁、修复和保存。 然后进行预测,不包含未跟踪的内容。
  29. 接下来了解什么是软复位、混合复位和 每一次改变都很艰难。