跳至内容
GitTree

课程 27 · 恢复

重置:软重置、混合重置和硬重置

将分支移回一次提交以三种方式进行,并查看每种模式对分支、暂存区域和文件的作用,以便您选择保留所需工作的模式。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 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 — 合并

文件摘录 · 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

文件摘录 · 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">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 — 奥马尔

文件摘录 · 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 下。

  1. 构建分支、救援引用、未暂存的编辑和注释,如下一节所示。在 Git 之外保留一份编辑和注释的副本。制作三个相同的副本并在三个选项卡中打开它们。
  2. Soft copy. 在图表中,右键单击 M(C 下面的提交,而不是分支提示)并打开 Reset private/reset to This Commit。选择Soft: Keep All Changes Staged。确认对话框显示此后的所有更改均保持暂存状态,并且没有文件更改。选择Reset private/reset。
  3. 检查软结果:分支位于 M 上,磁盘上的页面仍然显示“了解每个已保存的更改。”,并且暂存和未暂存列表都包含 index.html。
  4. Mixed copy. 在 M 上选择 Mixed: Keep Changes in the Working Folder。该对话框显示每个更改都保留在您的工作副本中,未暂存。选择Reset private/reset。分支位于 M 上,磁盘上的页面是相同的编辑,并且更改仅未暂存。
  5. Hard copy. 仅当您将编辑和注释保存到其他位置后,才选择 M 上的 Hard: Discard All Changes…。该对话框是一个警告:它列出了已删除的内容,并表示首先将其保留在 refs/ogt/trash 下。阅读它。默认为取消。选择Discard and reset private/reset。
  6. 检查硬结果:分支在 M 上,页面是 M 的标题,更改列表仅显示未跟踪的注释。通知上写着“重置为”和提交。
  7. 比较三个副本和仍位于 C 上的 rescue/before-reset。不要推送其中任何一个。

重置命令在分支已经存在的提交以及没有签出分支时被禁用。

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

将 SARA 保存为 index.html,然后:

Command · bash
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 之外保留两者的副本,然后制作三个相同的副本。每一项中:

Command · bash
TARGET_SHA="$(git rev-parse rescue/before-reset^)"

仅软拷贝:

Command · bash
git reset --quiet --soft "$TARGET_SHA"

仅混合副本:

Command · bash
git reset --quiet --mixed "$TARGET_SHA"

仅硬拷贝,一次性副本:

Command · bash
git reset --quiet --hard "$TARGET_SHA"

每份都写着:

Command · bash
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 中,通过应用程序进行的硬重置首先保存了快照,因此“撤消”可以将其恢复。在终端中进行的重置却没有。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    哪种重置模式仅移动分支并保持索引和文件原样?

    选择一个答案。

  2. 第 2 题,共 6 题

    对于硬重置,以下哪一项是正确的?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    在混合副本中,您将 private/reset 重置为 M。 git status --short 打印什么?

    选择一个答案。

  4. 第 4 题,共 6 题

    更改输入:您没有在 Git 之外保存编辑和注释,并且在终端中运行硬重置。您可以从哪里取回编辑内容?

    选择一个答案。

  5. 第 5 题,共 6 题
    必填

    重置后,git status --short 打印 MM index.html。运行哪种模式,索引保存什么?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    在其一次性副本中进行硬重置后,哪些读回显示它按照课程所述进行了操作?

    选择每个适用的答案。

0 个(共 6 个)正确

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

在此浏览器中检查。

练习

在每个副本中运行三个回读并填充一个表:分支指向哪里、索引保存什么、文件保存什么。然后说出您将使用哪种模式来重做提交消息,哪种模式用于取消所有内容,哪种模式用于丢弃所有内容。

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

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

回顾

  • 软仅移动分支。
  • Mixed 还会重置索引。
  • Hard 还会重写您的文件。

术语表介绍

重置 — 恢复;软的混合 — 混杂;硬——救援部门 — فف فٸ。

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 向后移动一个分支,并选择多少 其他改变。
  2. 轻柔地移动树枝。混合添加了 索引。硬添加您的文件。
  3. 所以区别是分阶段的、非分阶段的或 走了。
  4. 建立一个开始:一次提交,一次救援 分支、未保存的编辑和注释。
  5. 制作三份相同的副本,并写上 记下M的ID。
  6. 编辑从未提交。保留一份副本 在 Git 之外。
  7. 该图显示了 M,然后是 C,以及救援 C 上的分支。
  8. 右键单击M,打开重置子菜单,然后 选择软。
  9. 对话框说每一个变化都保持上演状态, 并且没有文件更改。
  10. 该分支现在位于 M 上。 C 仍然在 救援分会。
  11. 暂存列表包含旧的提交。的 未暂存列表有您的编辑。
  12. 磁盘上的文件仍然有您的编辑。
  13. 混合复制:相同的菜单,选择混合。
  14. 此对话框表示更改将保留, 未上演。
  15. 现在index.html只是未暂存。
  16. 您的编辑仍在文件中。
  17. 在硬之前,保存编辑和注释 其他地方。
  18. 硬拷贝:选择硬,带有点 意思是警告。
  19. 该对话框列出了删除的内容,并表示 它首先被保存。默认为取消。
  20. 选择丢弃并重置。
  21. 只剩下注释了。页面是M的 再次。
  22. 在终端中,第一个读取的是 提交。三个都是M。
  23. 带冒号的 git show 读取索引。 Soft保留旧页面。
  24. 每个副本的状态都不同。
  25. 救援分支仍然在旧的 提交。
  26. 磁盘上的文件:您编辑了两次,M 的 标题一次。
  27. 更改输入:无外部副本,并且 在终端很难。
  28. reflog 列出了提交。未保存的编辑 里面无处可寻。
  29. 并且硬覆盖未跟踪的文件,如果 目标那里有一个。
  30. 软混不失。硬在 首先保存应用程序。
  31. 练习:填写分支、索引表 以及每种模式的文件。
  32. 接下来,撤消共享提交,无需 重写历史,回归。