课程 5 · 基础
暂存预期的快照并进行第一次提交
在 GitTree 内创建项目的自述文件和英雄页面,选择属于第一次提交的内容,并故意保留稍后的编辑未提交。证明记录的内容,而不是仅通过通知来判断成功。
- 级别: 初学者
- 阅读 5 分钟
- 7 分钟的视频
- 已更新
- 在这节课之前: 预测您的下一次提交将包含什么内容, 创建您的课程存储库,然后区分克隆和打开
进度已保存在此浏览器中。
播放时会加载来自 YouTube 的视频(隐私增强模式)。
你将学到什么
- 在 GitTree 中创建并保存前两个项目文件。
- 暂存和取消暂存操作不会与删除工作文件混淆。
- 在提交之前将索引与工作树进行比较。
- 编写有用的摘要并仅提交准备好的快照。
- 验证第一次提交的文件、身份和剩余的工作更改。
开始之前
从第 4 课结束的地方开始。 original gittree-features 是未出生的 main 上的普通存储库,没有提交、项目文件或遥控器。其本地身份是 GitTree Demo / demo@example.com。不要继续第 4 课的补充 gittree-features-copy。
GitTree 的检查最小值为 Git 2.39.0。该视频是在 Ubuntu 24.04 上使用 Git 2.52.0 和 GitTree 2.0 录制的:这两个文件、它们的暂存和第一次提交都是在应用程序本身中进行的,并且终端检查针对应用程序创建的内容或针对状态 A、B 和 C 中的项目的单独副本运行,因此从未重播原始文件。 macOS 或 Windows 上没有运行任何内容,并且 Ubuntu 是唯一记录的 Linux 系统; Command 键和 Windows 和弦来自键盘映射源。
Native Git 不需要帐户来进行本地提交。在 GitTree 中登录,免费计划涵盖本课程。不需要提供商、专业版/试用版、AI 起草、API 密钥、CI 运行程序或云环境。不要添加远程来进行本地提交。
概念:选择内容,然后记录它们
提交并不是“保存所有可见的内容”。在本课中,正常提交会记录 index:完整的选定快照。它创建一个根提交并指出它的要点。它不会推到任何地方。
保存在编辑器中会更新 working tree。暂存会更新所选工作文件的索引。取消暂存会更改索引选择;它不是“丢弃”,也不会删除我们练习中的工作文件。在第一次提交之前,没有早期提交的版本可供恢复,因此未暂存的新文件再次变为未跟踪。
准备好的版本是一个有用的类比:您可以在准备好版本后修改工作草案,然后在本地发布准备好的版本,而不包含较新的草稿。登台并不是对后续编辑的实时订阅。 Git 的添加参考 记录该选择; 提交引用 将普通索引提交与其他模式区分开来。
我们使用 no -a、显式提交路径参数、修改、空提交或自动全部阶段。索引是整个下一棵树的描述,而不仅仅是更改名称的列表。
| 状态 | 工作索引.html | 索引index.html | 头/主要 | 远程 |
|---|---|---|---|---|
| A:保存初始文件 | HTML-01 | 缺席 | 未出生 | 无 |
| B:两个文件均已暂存 | HTML-01 | HTML-01 | 未出生 | 无 |
| C:支持登台后编辑的线路 | HTML-01-工作中 | HTML-01 | 未出生 | 无 |
| D:普通提交成功 | HTML-01-工作中 | HTML-01 | 第一次提交包含 HTML-01 | 无 |
README-01 也已上演并提交。 D之后,README就干净了; index.html 有意仅在工作树中保留修改状态。当状态不干净时,图表可以有新的提交。
完整的项目文件
使用 UTF-8、LF 和最后一个换行符。不要在保存的文件中包含 Markdown 栅栏。还没有 package.json、CSS、JS 或可运行的 Node 套件;这些内容在第 6 课中出现。
自述文件.md — 自述文件-01
# GitTree Features
A fictional landing page used to learn Git and GitTree.
All people and addresses in this repository are fictional.
No form submits information to a server.index.html — HTML-01,暂存之前
<!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>index.html — HTML-01-WORKING,仅在登台后
将保存的工作文件替换为完整正文 after 早期版本已进入索引:
<!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">Choose one change, then check what Git saved.</p>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn.</p></footer>
</body>
</html>唯一预期的替代品是英雄副本支持线。不要更改主标题或任何其他字节。
在GitTree
1.创建并保存两个初始文件
- 确认原始存储库的名称和主要上下文。打开 Command Palette…、Command+Shift+P / Ctrl+Shift+P,输入 New File… 并选择该命令 (
files.newFile)。如果没有文件夹参数,它将从项目根目录开始。 - 在 New File 中,将 Path from the project folder 设置为
README.md,然后选择 Create。期望新的工作文件在文件工作区中打开。创造拒绝现有的道路,而不是覆盖它。 - 将焦点置于可编辑内容区域,粘贴完整的 README-01 正文,然后选择 Save。替代方案:当工作编辑器获得焦点时 Command+S / Ctrl+S。实际保存成功后,预计 Unsaved changes 指示器会清除。
- 重复New File…→路径
index.html→Create。粘贴完整的 HTML-01,而不是稍后的工作变体。保存并等待未保存的指示器清除。 - 选择文件工具栏中的 Back to Graph,或调色板命令 Back to Graph (
view.returnToGraph)。然后使用调色板 Show Working Changes (wip.show)。预计 Unstaged Files 下有 README.md 和 index.html,Staged Files 下没有任何内容。 - 请注意 Stage Changes to Commit,如果它是主创作者按钮,而没有任何内容上演。其源定义的操作阶段 all 工作更改;这并不意味着提交成功。我们使用故意的每个文件暂存。
保存编辑器缓冲区不是暂存。在选项卡中查看文件并不能证明其最新缓冲区已到达磁盘。
2. 安全地暂存、取消暂存,然后准备两个文件
- 对于 Unstaged Files 下的 README.md,请使用其 Stage File 行操作。键盘替代方案:仅选择该行,将焦点保持在未暂存列表中,然后按 S;调色板命令是 Stage (
wip.stageSelected)。预计在 Staged Files 下有 README.md。 - 对于暂存文件下的 README 行,选择 Unstage File。键盘替代:仅选择它,将焦点保持在暂存列表中,然后按 U;调色板命令 Unstage (
wip.unstageSelected)。期望 README.md 返回到 Unstaged Files。其工作内容保持不变。 - 再次暂存 README.md,然后使用其 Stage File 操作暂存 index.html。预计正好是 two 个暂存文件路径。
- 单击每个暂存行以检查其完整添加。 index.html 仍必须包含 A clear view of Git history. 不要单独从文件计数推断内容。
单字母快捷方式的范围仅限于其列表,而不是在编辑器或摘要中键入 S/U 的请求。假定不存在拖放暂存行为。
3. 保存稍后的编辑而不暂存它
- 打开Show Files (
files.focus)、Command+Shift+E / Ctrl+Shift+E。将焦点置于文件树中的index.html,然后按 Enter 打开其工作副本。替代方法:单击其现有的已保存工作文件选项卡。在可编辑的 File 视图中工作,而不是历史 blob 或暂存的差异。 - 将其全部内容替换为上面的 HTML-01-WORKING。通过 Save 或 Command/Ctrl+S 保存。等待实际磁盘保存成功。
- 通过 Back to Graph 返回,然后经过 Show Working Changes。 index.html 现在出现在 both 列表中。单击其“未暂存文件”行:差异显示后来的支持行替换。
- 单击其暂存文件行:首次提交的添加仍包含早期的支持行。请not为较新的工作编辑选择暂存文件,或立即Stage All Changes。这将改变您正在准备的提交。
4.写入消息并提交索引
- 在作曲家 Summary 字段(占位符 Commit summary)中,准确输入
feat: add the GitTree Features hero。将 Description 留空。这个摘要说明了发生了什么变化;它不承诺完成站点或通过测试套件。 - 保持 Amend Previous Commit 关闭。展开 Commit Options 并验证 Skip Hooks (--no-verify)、Add Signed-off-by、Different Author、Push After Commit 和 Allow Empty Commit 均已关闭。请勿添加共同作者或调用 AI 起草。
- 最后回顾一下两条分阶段的路线和之前准备好的英雄路线。选择Commit Changes to 2 Files。键盘替代:Command+Enter / Ctrl+Enter,仅在确认活动存储库和挂起状态后通过调色板命令 Commit (
commit.submit) 路由。 - 等待Git的实际结果。成功的结果参考测量的 SHA;不要从图中复制伪造的 SHA。预计第一个图会在 main 上提交。在这种未更改的提交情况下,成功后消息草稿将被清除。
- 检查提交后列表:没有任何内容保留; index.html 保留在 Unstaged Files 下,后面一行。请not单击“阶段更改以提交”以“完成”此预期结果。
显示的文件计数是两个分段路径,而不是两个列表中的三行。 Push After Commit 是单独的后续选择;它已关闭并且没有遥控器。
在航站楼
在 <course-parent>/gittree-features 中运行,将占位符替换为您保留的实际父级。如果您已经执行了应用更改,inspect its resulting state;不要重播等效的突变并意外地超出检查点。
暂存之前保存的文件
git status --short观察到:
?? README.md
?? index.html有意尝试没有暂存内容的正常提交:
git commit --quiet -m "feat: add the GitTree Features hero"观察到退出 1 的标准输出,没有标准错误:
On branch main
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
index.html
nothing added to commit but untracked files present (use "git add" to track)没有创建提交。这个负面案例解释了为什么选择文件很重要;不要使用空提交来绕过它。
本地阶段/非阶段等效项
在同一保存文件状态的单独重播中:
git add -- README.md
git rm --cached --quiet -- README.md两个命令均无提示成功。 --cached 是必需的:它从索引 not the working file 中删除新条目。检查的自述文件字节保持不变,短状态再次显示两个未跟踪的文件。这是一个未提交的新文件示例;不要将其概括为删除跟踪的项目文件。
准备两者:
git add -- README.md index.html
git status --short
git diff --cached --stat观察状态:
A README.md
A index.html观察总结:
README.md | 6 ++++++
index.html | 21 +++++++++++++++++++++
2 files changed, 27 insertions(+)统计摘要计算的是行数,而不是正确性。在提交之前查看实际的暂存内容。
保存稍后的工作编辑后
git status --short
git diff -- index.html观察状态:
A README.md
AM 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 缩写,而不是虚构的提交 SHA。短状态间距和缩写长度可能因格式配置而异;两次比较必须保持相同。
阅读准确准备的文件:
git show :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>
</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>提交并验证
仅在本机重播中,无需重新暂存稍后的编辑:
git commit --quiet -m "feat: add the GitTree Features hero"观察到:没有输出,退出0。该装置没有有效的挂钩/签名,只有虚构的本地身份。不要禁用真实项目的挂钩/签名来强制教程成功。
检查本机或实际应用程序结果:
git log -1 --format="%s%n%an <%ae>%n%cn <%ce>"
git rev-list --count HEAD
git ls-tree --name-only HEAD
git status --short
git diff --cached
git remote按前四个命令的顺序观察到的输出:
feat: add the GitTree Features hero
GitTree Demo <demo@example.com>
GitTree Demo <demo@example.com>
1
README.md
index.html
M index.html最后两个命令各自生成 no output and exited 0。工作编辑仍然存在;不存在遥控器。这是本地首次提交,而不是上传。
对于独立内容确认,git show HEAD:index.html 返回了上面显示的完整 HTML-01 正文作为准备好的输出; git diff -- index.html 仍然显示准确的支撑线替换。两个路径的索引都与 HEAD 匹配。较新的文件没有丢失。
结果
在本课程结束时,要点是包含声明的摘要和虚构的作者/提交者的确切一次提交。 HEAD和索引包含README-01和HTML-01;工作index.html 包含HTML-01-WORKING。 Status 的前导空格为index.html,然后是M。没有遥控器。
在将此检查点交给第 6 课之前,请勿“清理”有意编辑、进行第二次提交、修改根目录或添加可选练习笔记本。任何后续的清理延续笔记本都属于单独保留的变体,而不是这个双文件首次提交。
常见错误
- Saving without staging: 磁盘字节和选定的提交字节不同。
- Staging again after the deliberate edit: 有效的 Git 行为,但较新的行将进入提交,从而更改本课的结果。
- Counting all visible rows as staged files: 一条路径可以进行分阶段和非分阶段比较。
- Using Stage All Changes as a final cleanup: 它将选择有意省略的编辑。
- Enabling amend or automatic push: 这些是具有不同范围的不同操作。
- Calling unstage Discard: unstage 编辑索引选择;丢弃可以删除工作内容。
如果出现问题
如果“新建文件”拒绝现有路径,请取消并检查它。不要覆盖未知内容。如果编辑器报告磁盘已更改,则保留两个版本并根据实际状态使用其 Review Changes、Reload from Disk 或 Keep Editing 控件;不要盲目选择Overwrite with My Edits。
如果提交因未暂存任何内容而被阻止,请选择所需的文件并查看它们。如果身份缺失,请检查第 4 课中的本地设置;失败的尝试可以提供带有显式存储库目标的 Set up your Git identity。它并不证明全局身份写入是合理的,并且保存身份并不意味着提交自动成功。
如果 Git 拒绝提交或挂钩失败,请阅读 Hook Output(如果有)。源定义的拒绝文本为 The commit was not created. Your message and staged changes are unchanged. 更正所述原因并在重试之前重新检查索引。不要仅仅为了制造绿色效果而勾选“跳过钩子”。在不确定结果后重新检查实际 HEAD,然后再次提交。
如果创建的提交包含意外内容,请停止并记录其真实 SHA、工作/索引状态和消息。不要立即修改、重置或单击“放弃”。现在更改配置不会更改已存储在该提交中的元数据。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
正确回答所需的问题以完成课程。
在此浏览器中检查。
练习
对已完成的原件使用文章的状态/内容查询。解释为什么一次提交和剩余的工作修改都是正确的。在阅读准备好的文件之前记录您的预测。
对于 separate disposable replay only,请在提交之前暂存稍后编辑的 index.html。预测新的线路被记录并且状态变得干净。请勿更改原始版本来执行此替代方案。如果尚不存在浏览器练习,请使用两个记录并解释不同的结果。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- 保存更改工作文件;暂存为下一次普通提交选择内容。
- 第一次提交记录索引并推进本地 main,而不进行推送。
- 分别核实内容、身份和剩余工作;肮脏的结果可能是故意的。
有关的
术语表介绍
舞台 — Таний;取消舞台 — ?????????????????????????????????提交 — 详细信息;索引 — 索引;工作树 — ????????????未追踪 — 未追踪;作者 — বালা;提交者 — ?????丢弃的意思是“取消”,与“取消暂存”不同。
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 创建英雄,准备一个版本, 并证明你的第一次提交保存了什么。
- 从原始存储库开始 L004,不是它的补充克隆。
- 保存、暂存和提交 更改不同的快照。
- 通过创建第一个文件 GitTree 的新建文件命令。
- 将其命名为 README 点 em dee,位于项目根目录。
- 保存完整的虚构项目 README,而不是 Markdown 栅栏。
- 创建索引点 H T M L 在同一个存储库中。
- 拯救最初的英雄 有了这条支撑线。
- 打开工作更改以查看 都是新的、未跟踪的文件。
- 没有任何上演,这 按钮首先暂存所有更改。
- 终端确认两个 未跟踪的文件,不是两次提交。
- 普通的 commit 无法记录这些 在选择文件内容之前。
- 首先仅暂存自述文件。
- 再次取消暂存。已保存 工作文本保持不变。
- 取消暂存更改选择; 丢弃可以删除工作内容。
- 现在将两个预期文件一一暂存。
- S 和 U 快捷键在其各自的位置工作 聚焦列表,而不是文本字段内。
- 回顾上演的内容, 不仅仅是文件数量。
- 摘要计数行数;确实如此 不能证明这些线是正确的。
- 准备的版本是 依然是原来的英雄。
- 重新打开工作文件, 不是阶段性的比较。
- 保存后面的配套 行而不暂存它。
- 现在出现相同的路径 在两次比较中。
- 非阶段性比较显示 稍后针对索引进行编辑。
- 阶段性补充仍 包含较早的行。
- 直接读取索引 来证明所准备的东西。
- 无需再次上演,这支持 第一个提交将包含行?
- 写一个总结来描述 您实际添加的英雄。
- 保留修改和所有可选行为 关闭第一个本地提交。
- 提交两个阶段路径, 不是每个可见的行。
- 等待Git确认创建之前 将操作视为完成。
- Main 现在指向它的第一个本地提交。
- 稍后的工作编辑仍然存在 故意在提交之外。
- 确认主题、作者 和独立的提交者。
- 有一个提交包含 正是这两条路径。
- 空的缓存差异可以共存 进行工作修改。
- 录制文件较早;的 工作文件仍然有较新的行。
- 没有上传任何内容。这个 存储库仍然没有远程。
- 如果您先进行稍后的编辑, 准备好的版本发生变化。
- 该替代提交记录了 新的线路并留下干净的结果。
- 提交快捷方式是一种替代方法 提交,而不是第二个完成步骤。
- 如果 Git 拒绝,请检查其输出并 重试之前的暂存内容。
- 不要丢弃剩余的编辑 或者假设撤消覆盖了每个缓冲区。
- 你的检查点是一个精确的提交 加上一项深思熟虑的工作编辑。
- 检查录音内容、身份 和剩余的工作分开。
- 保存写入工作文件; 分期选择;提交记录。
- 保留以后的编辑。接下来,检查 diffs 并添加项目的工具。
- 从这个验证状态继续, 不是来自猜测的干净文件夹。