课程 27 · 恢复
重置:软重置、混合重置和硬重置
将分支移回一次提交以三种方式进行,并查看每种模式对分支、暂存区域和文件的作用,以便您选择保留所需工作的模式。
- 级别: 高级
- 阅读 4 分钟
- 6 分钟的视频
- 已更新
- 在这节课之前: 预测您的下一次提交将包含什么内容, 不用动头就能读历史
进度已保存在此浏览器中。
播放时会加载来自 YouTube 的视频(隐私增强模式)。
你将学到什么
- 说出每种重置模式移动的内容:分支、索引和磁盘上的文件。
- 在破坏性模式发生之前保护已提交的工作和未提交的工作。
- 读取每种模式留下的状态输出。
- 了解硬重置可以覆盖哪些文件,包括未跟踪的文件。
开始之前
您位于 private/reset,这是一个从第 18 课(“清楚地看到您的工作”)中的合并页面 M 开始的分支。它在 M、C 之上有一个提交,这将标题更改为“自信地审查更改”。分支 rescue/before-reset 已指向 C。提交后,您再次编辑页面,以“了解每个已保存的更改。”,并且您尚未暂存或提交它。您还有一个未跟踪的笔记,docs/signup-hint.md。您想要将 private/reset 移回 M。
一切都是本地的并且采用免费套餐(GitTree 要求您登录):没有托管帐户、没有提供商、没有互联网。每个身份都是虚构的(example.com)。切勿在实际项目中运行本课程。硬重置副本是一次性的。
在 GitTree 中或使用本机 Git 命令进行更改,而不是在同一副本中进行更改。读取结果总是安全的。菜单标签来自 GitTree 2.0 自己的字符串,本机命令使用 Git 2.43 在一次性副本中运行。 GitTree 步骤未在 macOS、Windows 或 Linux 上运行。
概念和状态效应
重置将当前分支移动到另一个提交。模式决定了它触及的程度。 Soft 仅移动分支:索引和文件保持原样,因此差异显示为分阶段更改。 Mixed 移动分支并将索引替换为目标:您的文件保留,因此差异显示为未暂存的更改。 Hard 移动分支,替换索引并将跟踪文件重写到目标。您对跟踪文件的未提交编辑已消失。
救援分支保留提交C,因此可以再次找到提交的标题。它不会保留从未提交的新编辑。可以通过 reflog 找到提交;未保存的编辑不能,因为它们从未在 Git 中。在任何破坏性模式发生之前保护好它们。
当目标在同一路径上有跟踪文件时,硬重置也会覆盖未跟踪的文件。不妨碍的未跟踪文件(例如此处的 docs/signup-hint.md)将被保留。这是对这个项目的观察,而不是对每个未跟踪文件的承诺。
在所有三种模式中,分支是唯一移动的引用:rescue/before-reset,其他分支和服务器上的任何内容都保持原样。
GitTree 首先询问。它的重置对话框会显示将保留的内容,对于硬重置,它会显示删除的所有内容都会首先保存在 refs/ogt/trash 下,以便撤消可以将其恢复。在终端中运行重置不会产生这样的快照。
准备准确的项目状态
从第 18 课合并结果 M 的单独普通副本开始,并保持原始副本不变。创建分支,将 SARA 保存为标题提交,并在其中分支救援引用。然后将 OMAR unstaged 和 DOC_HINT 保存为新文件。在 Git 之外保留一份 OMAR 和注释的副本,然后制作三份相同的副本,软副本、混合副本和硬副本各一份。
完整的文件输入
仅在下面指定的阶段保存。这些是完整的 UTF-8/LF 正文,最后有换行符;永远不要粘贴 Markdown 栅栏。未更改的可运行文件继承命名输入。单独变体中的版本不得覆盖原始版本。
index.html — 合并
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html — SARA
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Review changes with confidence.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html — 奥马尔
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Understand each saved change.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>文档/signup-hint.md — DOC_HINT
Unfinished signup hint: use fictional data only.在GitTree
使用 Command+Shift+P(在 Ubuntu 上为 Ctrl+Shift+P)打开调色板。重置位于提交的右键菜单上,位于子菜单 Reset private/reset to This Commit 下。
- 构建分支、救援引用、未暂存的编辑和注释,如下一节所示。在 Git 之外保留一份编辑和注释的副本。制作三个相同的副本并在三个选项卡中打开它们。
- Soft copy. 在图表中,右键单击 M(C 下面的提交,而不是分支提示)并打开 Reset private/reset to This Commit。选择Soft: Keep All Changes Staged。确认对话框显示此后的所有更改均保持暂存状态,并且没有文件更改。选择Reset private/reset。
- 检查软结果:分支位于 M 上,磁盘上的页面仍然显示“了解每个已保存的更改。”,并且暂存和未暂存列表都包含
index.html。 - Mixed copy. 在 M 上选择 Mixed: Keep Changes in the Working Folder。该对话框显示每个更改都保留在您的工作副本中,未暂存。选择Reset private/reset。分支位于 M 上,磁盘上的页面是相同的编辑,并且更改仅未暂存。
- Hard copy. 仅当您将编辑和注释保存到其他位置后,才选择 M 上的 Hard: Discard All Changes…。该对话框是一个警告:它列出了已删除的内容,并表示首先将其保留在
refs/ogt/trash下。阅读它。默认为取消。选择Discard and reset private/reset。 - 检查硬结果:分支在 M 上,页面是 M 的标题,更改列表仅显示未跟踪的注释。通知上写着“重置为”和提交。
- 比较三个副本和仍位于 C 上的
rescue/before-reset。不要推送其中任何一个。
重置命令在分支已经存在的提交以及没有签出分支时被禁用。
对于课程中的每个普通提交:Summary 是规定的主题,Description 为空,并且选项 Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit 和 Allow Empty Commit 保持关闭状态。
在航站楼
在第 18 课结果的单独副本中:
git switch --create private/reset将 SARA 保存为 index.html,然后:
git add -- index.html
git commit --quiet -m "feat: reset snapshot example"
git branch rescue/before-reset将 OMAR 保存为 index.html(不进行分段),将 DOC_HINT 保存为 docs/signup-hint.md。在 Git 之外保留两者的副本,然后制作三个相同的副本。每一项中:
TARGET_SHA="$(git rev-parse rescue/before-reset^)"仅软拷贝:
git reset --quiet --soft "$TARGET_SHA"仅混合副本:
git reset --quiet --mixed "$TARGET_SHA"仅硬拷贝,一次性副本:
git reset --quiet --hard "$TARGET_SHA"每份都写着:
git rev-parse HEAD
git show :index.html
git status --short每个HEAD都是M。该索引保存软后的SARA以及混合和硬后的M的页面。磁盘上的文件是软混合后的OMAR和硬后的M页。状态是:
软:
MM index.html
?? docs/signup-hint.md混合:
M index.html
?? docs/signup-hint.md硬:
?? docs/signup-hint.md终端重置没有生成 GitTree 快照。 git reflog 仍然列出 C,但 OMAR 不在其中。在单独的备份实验室中,对具有跟踪的 docs/signup-hint.md 的提交进行硬重置会覆盖该路径中未跟踪的文件。
结果
Where you end: 所有三个分支都在 M.Soft 上:索引保存 SARA,文件保存 OMAR。混合:索引保存 M,文件保存 OMAR。困难:两者都持有 M。未跟踪的笔记保留在每个副本中,而 rescue/before-reset 仍在 C 上。
常见错误
- 将救援部门视为更新的、未承诺的工作的备份。
- 使用硬重置来整理结帐,而不先保存编辑。
- 预计软重置不会留下任何痕迹。
- 重置您已经推送的分支,然后将其推送到队友的工作上。
如果出现问题
使用救援参考再次查找提交的标题,以及用于编辑和注释的外部副本。在 GitTree 中,通过应用程序进行的硬重置首先保存了快照,因此“撤消”可以将其恢复。在终端中进行的重置却没有。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
正确回答所需的问题以完成课程。
在此浏览器中检查。
练习
在每个副本中运行三个回读并填充一个表:分支指向哪里、索引保存什么、文件保存什么。然后说出您将使用哪种模式来重做提交消息,哪种模式用于取消所有内容,哪种模式用于丢弃所有内容。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- 软仅移动分支。
- Mixed 还会重置索引。
- Hard 还会重写您的文件。
有关的
术语表介绍
重置 — 恢复;软的混合 — 混杂;硬——救援部门 — فف فٸ。
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 向后移动一个分支,并选择多少 其他改变。
- 轻柔地移动树枝。混合添加了 索引。硬添加您的文件。
- 所以区别是分阶段的、非分阶段的或 走了。
- 建立一个开始:一次提交,一次救援 分支、未保存的编辑和注释。
- 制作三份相同的副本,并写上 记下M的ID。
- 编辑从未提交。保留一份副本 在 Git 之外。
- 该图显示了 M,然后是 C,以及救援 C 上的分支。
- 右键单击M,打开重置子菜单,然后 选择软。
- 对话框说每一个变化都保持上演状态, 并且没有文件更改。
- 该分支现在位于 M 上。 C 仍然在 救援分会。
- 暂存列表包含旧的提交。的 未暂存列表有您的编辑。
- 磁盘上的文件仍然有您的编辑。
- 混合复制:相同的菜单,选择混合。
- 此对话框表示更改将保留, 未上演。
- 现在index.html只是未暂存。
- 您的编辑仍在文件中。
- 在硬之前,保存编辑和注释 其他地方。
- 硬拷贝:选择硬,带有点 意思是警告。
- 该对话框列出了删除的内容,并表示 它首先被保存。默认为取消。
- 选择丢弃并重置。
- 只剩下注释了。页面是M的 再次。
- 在终端中,第一个读取的是 提交。三个都是M。
- 带冒号的 git show 读取索引。 Soft保留旧页面。
- 每个副本的状态都不同。
- 救援分支仍然在旧的 提交。
- 磁盘上的文件:您编辑了两次,M 的 标题一次。
- 更改输入:无外部副本,并且 在终端很难。
- reflog 列出了提交。未保存的编辑 里面无处可寻。
- 并且硬覆盖未跟踪的文件,如果 目标那里有一个。
- 软混不失。硬在 首先保存应用程序。
- 练习:填写分支、索引表 以及每种模式的文件。
- 接下来,撤消共享提交,无需 重写历史,回归。