课程 26 · 恢复
隐藏工作并安全地恢复它
将未完成的编辑和新注释用 stash 放在一边,用 Apply 将它们带回来,然后看看 Pop 在发生冲突时会做什么:stash 会一直保留,直到您做出决定。
- 级别: 中级
- 阅读 2 分钟
- 5 分钟的视频
- 已更新
- 在这节课之前: 暂存预期的快照并进行第一次提交, 解决合并和变基冲突
进度已保存在此浏览器中。
播放时会加载来自 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 下;储藏室的操作位于其右键菜单中。
- 构建分支和两个未暂存的更改,如下一节所示。阅读更改列表:
docs/stash-conflict.md已修改,docs/signup-hint.md是新的。 - 打开调色板并运行 Stash Changes…。在对话框中将 Message 设置为
signup hint rehearsal。 Only staged changes 已关闭。 Include untracked files 已开启。 Keep staged changes in place too 已关闭。选择Stash。 - 等待“已隐藏您的更改”的通知。更改列表为空,注释已从磁盘中消失,并且存储显示在 Stashes 下。
- 将鼠标悬停在隐藏行上:其工具提示显示“包括未跟踪的文件”。右键单击它并选择 Show Stash:图表选择存储,右侧面板列出其跟踪的更改
docs/stash-conflict.md。未追踪的纸条被保存在储藏室的一个单独部分中。 - 再次右键单击它并选择 Apply Stash。通知上写着“已应用隐藏的物品;它仍在列表中。”
- 检查结果:
docs/stash-conflict.md再次被修改,docs/signup-hint.md作为未跟踪文件返回,分支提示是相同的提交,并且存储仍然列出。 - Separate conflict copy. 在第二个副本中,在存储之后,将 DOC_STASH_OTHER 提交到同一文件。右键单击存储并选择 Pop Stash。警告说“存储与您的更改冲突:解决冲突。存储被保留。”
- 冲突的文件以 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 课结果的单独副本中:
git switch --create private/stash-hint将 DOC_STASH_BASE 保存为 docs/stash-conflict.md,然后:
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,而不进行暂存。然后把两者都藏起来:
git stash push --include-untracked --message "signup hint rehearsal"
git status --short
git stash list --format=%sOn private/stash-hint: signup hint rehearsal状态不打印任何内容:树是干净的。为冲突保留此状态的未更改副本,然后应用:
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 并提交,然后弹出:
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=%sPop 以 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… 在提交时为存储提供了自己的分支。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
正确回答所需的问题以完成课程。
在此浏览器中检查。
练习
证明存储后树是干净的,应用恢复了两个文件,并且存储仍然列出。预测如果 Include untracked files 关闭会有什么不同。在冲突副本中,证明藏品在流行中幸存下来。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- 有目的地选择隐藏选项。
- 应用保留该条目。
- 矛盾的波普也保留了它。
有关的
术语表介绍
藏匿 — биби;申请 — Нибим;流行音乐——流行音乐;未追踪 — 详细信息。
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 把未完成的工作放在一边,然后带过来 安全回来。
- 一个储藏室将您的编辑保存在架子上,并且 清理工作树。
- 应用将更改恢复并保留 条目。如果干净的话,Pop 将其移除。
- 一次提交创建一个分支,然后编辑 文件并添加新注释。
- 在更改列表中:一个已修改的文件, 和一个新文件。
- 写下当前的提交。一定不能 移动。
- 打开调色板并运行 Stash Changes。
- 给它一条你能认出的信息。
- 仅上演已关闭。包括未跟踪的是 上。保持上演已关闭。
- 被忽略的文件是一个不同的类别, 并且不要进去。
- 选择Stash,然后等待通知。
- 更改列表为空,并且存储 已列出。
- 工具提示显示未跟踪的文件是 包括在内。 Show Stash 列出其文件。
- 右键单击存储,然后选择“应用” 藏起来。
- 通知称,藏品仍在 列表。
- 两者都回来了:编辑和注释。
- 分支提示是相同的提交。否 stash 命令做了一个。
- 而且藏品仍然在架子上。
- 在终端中, git stash push with 包括未跟踪,然后是状态。
- 该列表显示消息,其中 首先是分行名称。
- git stash apply 将两者都带回来。
- 存储仍然列出,并且 HEAD 是 一样。
- 如果没有该选项,注释将保留在 磁盘。
- 在冲突副本中,我们提交另一个 先改变,再流行。
- 警告称该藏品已被保留。的 文件有冲突。
- 解决该文件,并将其标记为已解决。 藏品还在那里。
- 仅当您确定时才删除存储。 或者给它自己的分支。
- 实践:证明清洁、修复和保存。 然后进行预测,不包含未跟踪的内容。
- 接下来了解什么是软复位、混合复位和 每一次改变都很艰难。