跳至内容
GitTree

课程 3 · 基础

预测您的下一次提交将包含什么内容

将您正在编辑的文件与为提交准备的快照以及记录的历史记录分开。使用未来的 GitTree 功能英雄来解释为什么一个文件可以同时进行暂存和修改。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 YouTube 上观看

你将学到什么

  • 区分工作树、索引和最后记录的提交。
  • 预测哪些暂存、编辑和正常提交更改。
  • 阅读简短状态的两列,不要假设暂存意味着永久保存。
  • 对未暂存和已暂存的更改进行单独比较。

开始之前

先读第1课;第 2 课准备 Git 和您的提交身份。您从 no course repository 开始,结束时没有:这是一堂概念课。第一个动手初始化是第 4 课,在 GitTree 内。

本课预览了您将在第 5 课中创建的四种状态。下面的终端输出以及视频中的 GitTree 屏幕来自未来项目的一次性副本:命令和屏幕是在 Ubuntu 24.04 上使用 Git 2.52.0 和 GitTree 2.0 录制的。它们没有在 macOS 上运行。视频中的每个这样的场景都被标记为“未来第 5 课预览”。不要在不相关的工作存储库中运行未来状态命令或立即初始化额外的练习存储库;观看并阅读预览,然后在第 5 课达到这些状态时重复查询。

GitTree 的检查最小值为 Git 2.39.0。在 macOS 上,按 Command,其中 Windows 和 Linux 使用 Ctrl。命令未在 Windows 上运行。本地模型不需要提供商、帐户、专业版或试用版。

概念:三个地方,一个文件不移动

您的 working tree 是磁盘上的项目文件。编辑和保存文件会更改这些字节。 Git 不一定选择它们进行提交。

index,也称为 staging area,描述您正在准备的下一个快照。暂存文件会根据其当前内容更新其索引条目。它不是对以后编辑的永久订阅。

commit 记录一棵树以及元数据和父关系。 HEAD 标识您当前的位置,通常是通过已签出的分支。在第一次提交之前,即使不存在分支提交,HEAD 也可以命名未出生的分支。

一个有用的类比是工作草案、准备版本和记录版本。不要从字面上理解这个类比:暂存不会移动或删除工作文件。在正常的跟踪路径中,三个版本可以独立地一致或不同。

我们使用准备好的索引的正常提交、without -a、显式路径参数、自动暂存或修改。其他提交模式不能与此示例互换。 Git 的添加参考 解释了临时快照行为; diff 参考 区分比较。

未来的确切例子

文件是index.html。它的标题仍然是 Understand every change. 它的支持线有两个版本:

文件摘录 · html
<p id="hero-copy">A clear view of Git history.</p>

后来的工作编辑:

文件摘录 · html
<p id="hero-copy">Choose one change, then check what Git saved.</p>

这些是项目的完整原始页面和完整编辑页面的行摘录,而不是粘贴在整个页面上的替换文件。

未来状态最后一次提交索引工作文件index.html 的简短状态
答:创建文件没有提交禁止进入原始页面?? index.html
B:阶段演示文件没有提交原始页面原始页面A index.html
C:暂存后编辑没有提交原始页面编辑页面AM index.html
D:提交索引原始页面原始页面编辑页面 M index.html

完整的项目还包含一个自述文件。这两个文件都在第一次提交之前暂存;状态示例仅限于index.html。在 D 中,自述文件很干净,index.html 保留了其经过深思熟虑的未暂存编辑。

对于这里的正常非冲突行,短状态的第一列将索引与 HEAD 进行比较;第二个将工作树与索引进行比较。 ?? 是特殊的未跟踪标记,而不是两个普通的修改列。 M 中的前导空格很重要。

有什么变化

  • Stage:更新索引内容;没有提交或分支移动,没有工作文件重写。
  • Edit after staging: 仅更新工作字节;准备好的索引仍然是早期版本。
  • Normal commit: 记录准备好的快照并更新当前的本地分支。索引仍然是那个快照;不相关的后续工作编辑仍然存在。
  • Remote: 这些本地步骤都不会推送、获取或创建远程跟踪引用。此示例没有遥控器。

该索引不仅仅是一个名称列表。高级冲突可以容纳多个索引阶段;我们在这里对普通的零阶段文件条目进行建模,而不是未解决的合并。

在终端中 - 预览未来的检查点

Do not execute these in the still-uninitialized learner project. 它们以一次性副本的形式运行,其中包含完整的自述文件和页面的两个版本。第 5 课提供了真正的创作和舞台步骤。

在未来的状态 C,检查两个版本

Command · bash
git status --short -- index.html

观察到:

输出
AM index.html

直接读取准备好的文件:

Command · bash
git show :index.html

观察到的full output:

输出
<!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>
</head>
<body>
  <header class="site-header">
    <a href="#main">GitTree Features</a>
  </header>
  <main id="main">
    <section class="hero" aria-labelledby="hero-title">
      <p class="eyebrow">GitTree Learn demo project</p>
      <h1 id="hero-title">Understand every change.</h1>
      <p id="hero-copy">A clear view of Git history.</p>
    </section>
  </main>
  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
</body>
</html>

将工作树与索引进行比较:

Command · bash
git diff -- index.html

观察到:

输出
diff --git a/index.html b/index.html
index 5470374..27f8718 100644
--- a/index.html
+++ b/index.html
@@ -13,7 +13,7 @@
     <section class="hero" aria-labelledby="hero-title">
       <p class="eyebrow">GitTree Learn demo project</p>
       <h1 id="hero-title">Understand every change.</h1>
-      <p id="hero-copy">A clear view of Git history.</p>
+      <p id="hero-copy">Choose one change, then check what Git saved.</p>
     </section>
   </main>
   <footer><p>Built by a fictional team for GitTree Learn.</p></footer>

上面的对象缩写是来自这些确切 LF 文件体的实际文件 blob ID,而不是发明的提交 SHA。您的缩写长度/输出可能因配置而异。

检查分阶段添加,相对于第一次提交之前的空历史记录:

Command · bash
git diff --cached --stat -- index.html

观察到:

输出
 index.html | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

--stat 总结;这不是内容审查。完整的暂存快照是 git show :index.html 显示的较早文件。

在未来的状态 D,检查记录了什么

第 5 课正常提交准备好的索引后:

Command · bash
git log -1 --format=%s
git status --short -- index.html
git diff --cached -- index.html

观察前两个输出,按顺序:

输出
feat: add the GitTree Features hero
 M index.html

第三个命令打印 no output 并成功退出:索引和 HEAD 同意此路径。这并不意味着工作树是干净的。工作差异仍然显示上面的支持行编辑。这是“提交错过了我的最新编辑”的常见原因,实际上是正确的 Git 行为。

在GitTree

在您当前的无存储库上下文中

  1. 保持 New Tab 打开,如果需要,请使用 Command+T / Ctrl+T (tab.new)。
  2. 在 macOS 或其他位置的 Alt+H 上使用 Option+H 打开 Feature Guide,或者使用 Command+Shift+P / Ctrl+Shift+P 打开 Command Palette… 并选择 Feature Guide。
  3. 在 Features 中,将 stage 输入到 Search features 中并读取 Stage and commit。不要运行初始化操作。该卡只是一个方向,而不是暂存文件的证明。
  4. 按 Escape 关闭指南。您的课程存储库仍然不存在。

GitTree 中的相同状态(如视频所示)

该视频在 GitTree 中打开未来项目的一次性副本,标记为“未来第 5 课预览”。这不是您的项目,也不是您工作的录音。

  1. 在 C 处,打开 Command Palette…,输入 Show Working Changes,然后选择该命令 (wip.show)。该命令没有断言默认快捷方式。
  2. 检查右侧面板的 Unstaged Files 和 Staged Files。 index.html 出现在两者中,因为它有两个不同的比较;它不是两个物理文件。
  3. 单击 Unstaged Files 中的行。期望中心差异显示原始页面更改为编辑页面,包括支持行更改。
  4. 单击 Staged Files 中的行。预计会分阶段添加,其中包含之前的支撑线。仅检查任一行不会暂存或取消暂存任何内容。
  5. 在D处,正常提交后,图有第一次提交; Staged Files 说 Nothing is staged. A commit contains only staged changes. 工作编辑仍保留在 Unstaged Files 下。
  6. 在此概念预览中,not单击 Stage File、Unstage File、Stage All Changes 或 Discard Changes…。第 4 课和第 5 课中提供了专门的创建和提交说明。

结果

您可以从 C 预测 D:第一次提交记录了较早的支持行,而稍后的工作编辑仍然保留。您自己的项目处于无存储库状态。未来项目的图表是明确标记的预览,而不是您已完成的工作。

常见错误

  • “Staged means all future edits are included.” 这意味着索引包含当时选定的版本。
  • “Empty cached diff means no edits.” 它表示索引和 HEAD 同意所选路径;还要检查工作差异。
  • “Two lists mean two files.” 它们是同一路径的两次比较。
  • “A staged file is safely committed.” 索引是可变的;它不是持久的历史记录或备份。
  • “Commit means remote update.” 此示例中没有遥控器,也没有发生推送。

如果出现问题

如果您现在运行存储库查询并得到“不是 git 存储库”,请保持课程检查点完整并阅读预览。不要创建第二个存储库来使示例命令成功。

如果您自己的项目稍后显示不同的状态,请在尝试修复之前检查所选路径。剪辑后又上台了吗?这会改变准备好的快照,从而改变预测的提交。您使用了自动阶段命令吗?这是与此处正常的仅索引提交不同的操作。

在这个阶段,我们通过确定正确的比较来恢复,而不是破坏内容。第 5 课展示了安全的暂存决策,恢复路径教授范围检查的撤消和重新记录。 GitTree 垃圾快照并不能保证每个任意编辑器保存都是可恢复的。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    哪个快照提供此处建模的正常提交?

    选择一个答案。

  2. 第 2 题,共 6 题

    在 C 处,由于后期编辑而发生了什么变化?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    在 C 处,提交索引而不再次暂存。记录的是哪一行?

    选择一个答案。

  4. 第 4 题,共 6 题
    必填

    从 C 开始,暂存编辑后的版本,然后提交。有什么变化?

    选择一个答案。

  5. 第 5 题,共 6 题

    在 D 处,缓存的 diff 为空,但状态为 space,然后为 M。为什么?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    按照A→B→C,然后进行索引的正常提交。哪些观察结果证明了 D?

    选择每个适用的答案。

0 个(共 6 个)正确

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

在此浏览器中检查。

练习

在第 5 课之前,在纸上进行预测:暂存一个文件,暂存后对其进行编辑,然后正常提交。记录了哪些支持线,以及后来的编辑保留在哪里?然后更改顺序:在提交之前再次暂存已编辑的文件。现在记录的行应该是较新的行,没有任何剩余的工作差异。视频显示了两条路线的真实输出;您将在第 5 课中亲自检查这两个内容。

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

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

回顾

  • 工作文件、索引和记录的历史是不同的快照。
  • 暂存捕获所选内容;以后的编辑不会自动更新。
  • 检查这两个比较,不要将本地提交误认为是远程操作。

术语表介绍

工作树 — ????????????????????????集结区/索引 — มงองรรรรรรรรรรรรรรรรรรรรร提交 — 详细信息; ref—— 参考;未追踪 — 未追踪;上演- ُهَّٲ。 HEAD 仍然是字面技术标识符。

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 通过分离来预测提交 工作文件、索引和历史记录。
  2. 这是未来项目的预览。你的 自己的存储库尚未创建。
  3. 使用三张带标签的快照, 不是在盒子之间移动的文件。
  4. 工作树包含 您编辑并保存在磁盘上的文件。
  5. 索引描述了快照 你正在准备提交。
  6. 一次提交记录快照、元数据 及其与早期历史的关系。
  7. 在第一次提交之前,分支 有名字但尚未记录提示。
  8. 暂存选择当前内容,而不是 稍后进行编辑,而不移动文件。
  9. Our future hero begins 有了这条支撑线。
  10. 在A处,该文件仅存在于 工作树并且未被跟踪。
  11. Stage the demo files.指数 现在拥有原来的英雄。
  12. Edit after staging. The working file 变化,但指数保持较早。
  13. 无需再次上演,这支持 行会是正常的提交记录吗?
  14. 它记录了准备好的线路, 不是后来的工作编辑。
  15. 短状态显示两种不同 相同路径的比较。
  16. 式中,A为分阶段添加;中号 是后来的工作修改。
  17. 读取准备好的文件 directly from the index.
  18. 该索引仍然包含 较早的支撑线。
  19. 普通 diff 比较工作 文件及其准备好的版本。
  20. 在第一次提交之前,缓存的 摘要描述了暂存的新文件。
  21. 现在检查相同的状态 在真实的 GitTree 录音中。
  22. 打开显示工作变更 通过命令面板。
  23. 未暂存的行显示较新的 针对索引进行工作编辑。
  24. 分阶段的行显示较早的 为第一次提交准备的文件。
  25. 一条路径可以出现在两个列表中 无需创建两个物理文件。
  26. 阅读任何一个比较都不会 暂存、取消暂存或丢弃内容。
  27. 正常提交记录索引 并推进当地分支机构。
  28. 录音对象证实 第一个英雄提交存在。
  29. 领先的空间很重要:只有 工作比较仍然存在差异。
  30. 空的缓存差异意味着 索引与该路径的历史记录匹配。
  31. 工作差异仍然包含 较新的编辑。什么都没有丢失。
  32. 历史现在有了一个承诺,而 深思熟虑的工作编辑仍然存在。
  33. 改变顺序:上演 提交之前编辑的文件。
  34. 现在记录了较新的行,并且 这条路没有剩余的区别。
  35. 这些本地步骤都没有 将任何内容上传到提供商。
  36. 你自己的课程仍然没有结束 存储库;接下来是初始化。
  37. 不要丢弃文件或重置历史记录 只是为了进行示例匹配。
  38. 工作文件、准备内容 和记录的历史可能有所不同。
  39. 检查两个序列并 解释一下两个状态栏。
  40. 接下来,在里面创建 GitTree Features GitTree,然后自己测试这个模型。