跳至内容
GitTree

课程 7 · 日常工作

提交选定的块,而不是整个文件

准备一个标题和一个更宽的英雄,同时留下单独的卡片半径编辑供以后使用。故意使用文件、块和行选择,然后证明准确准备好的和剩余的CSS。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 YouTube 上观看

你将学到什么

  • 为特定提交选择文件、块或行范围。
  • 选择删除/添加的行进行替换。
  • 独立阅读索引和工作内容。
  • 保留第 8 课中未提交的半径编辑。

开始之前

您从第 6 课结束的地方开始:原始 main 有两个提交,可运行的第 6 课输入并且没有远程。工作/索引干净;被忽略的 dist 可以存在。该视频是在 Ubuntu 24.04 上使用 Git 2.52.0 和 GitTree 2.0 录制的:两次编辑均保存在 GitTree 自己的编辑器中,片段和台词均已上演并在应用程序中进行提交,终端检查针对应用程序创建的内容或单独的副本进行运行。块和线控制是真实操作的;本机补丁路由在单独的副本中运行。 macOS 或 Windows 上没有运行任何内容,并且 Ubuntu 是唯一记录的 Linux 系统。 GitTree 的源 Git 最低版本为 2.39.0。登录后,本地工作就属于免费计划。

概念

一个文件可以包含多个独立的决策。一个大块将附近的文本更改组合在一起,而不一定是一个商业意图。选择替换需要删除旧行and添加新行;仅选择添加可以创建不同的补丁。

该索引描述了完整的下一棵树,即使您只选择了一些更改的行。这里 HEAD 具有 CSS-01,索引变为 CSS-02-INDEX,工作 CSS 保持 CSS-02-WORKING。保存编辑会更改工作字节; Stage Lines 更改索引;正常提交会移动 main,但不会覆盖剩余的半径。没有远程裁判改变。 本机部分暂存 和补丁应用 使用相同的内容区别。

完整编辑和目标机构

将 index.html 替换为 HTML-02-HEADLINE,将工作 styles.css 替换为 CSS-02-WORKING。下面的 CSS-02-INDEX 是 target index,而不是用来覆盖工作文件的正文。

index.html — HTML-02-标题

文件摘录 · 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">
    <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>
  </main>
  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
  <script type="module" src="site.js"></script>
</body>
</html>

styles.css — CSS-02-INDEX

文件摘录 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.5rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

styles.css — CSS-02-工作

文件摘录 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

在GitTree

  1. 在 Show Files (Command/Ctrl+Shift+E) 中,聚焦每个现有文件并按 Enter;粘贴其指定的工作主体,然后粘贴 Save 或 Command/Ctrl+S。不要将索引目标粘贴到正在运行的 CSS 上。
  2. Back to Graph → 命令面板... (Command/Ctrl+Shift+P) → Show Working Changes。单击 Unstaged Files 下的 index.html。
  3. 在差异视图(调色板 Show Diff as Hunks)中选择 Hunk。在标题替换处选择 Stage Hunk。仅期待暂存文件中的完整标题更改。整个文件 Stage File 是等效的,只是因为此 HTML 没有其他编辑。
  4. 单击“未暂存文件”下的 styles.css。保持 Ignore whitespace 关闭。在第 41 行找到最大宽度替换:44rem → 48rem。
  5. 选中已删除的 max-width: 44rem; 行和添加的 max-width: 48rem; 行的复选框。它们的可访问名称包括符号、行号和文本。激活选择工具栏中的 Stage Lines。不要选择第 59 行的半径对。
  6. 单独重播中的替代方案:仅在最大宽度块上的 Stage Hunk 给出相同的目标。 Split/palette Show Diff Side by Side 将删除/添加的单元格放在其正确的旧/新面;两者都有自己的选择控件。返回 Hunk 进行主要拍摄。
  7. 单击 staged styles.css:只有 max-width 应该更改。单击未暂存的 styles.css:仅保留半径。使用 Clear 清除选择,而不是丢弃内容。如果您分阶段太多,请选择相关的分阶段块和 Unstage Hunk 或选择两个分阶段替换行和 Unstage Lines,然后重新检查。
  8. 输入摘要 feat: refine the hero and card spacing,普通选项全部关闭,然后输入 Commit Changes to 2 Files(或 Command/Ctrl+Enter 一次)。验证部分提交并保留未暂存的半径。
  9. 不要使用 Stage All Changes、丢弃或进行清理提交。第 8 课故意拥有 radius 提交。

过时的选择绑定到差异指纹;在任何外部编辑后重新加载,而不是应用针对旧字节的补丁。如果隐藏空格消除了行选择资格,请阅读原因并恢复完整的差异,而不是假装发生了选择。

在航站楼

保存两次编辑后:

Command · bash
git diff -- styles.css

完整观察到的工作差异:

输出
diff --git a/styles.css b/styles.css
index d443c7e..6382365 100644
--- a/styles.css
+++ b/styles.css
@@ -38,7 +38,7 @@ footer {
 }
 
 .hero {
-  max-width: 44rem;
+  max-width: 48rem;
   padding-block: 3rem;
 }
 
@@ -56,7 +56,7 @@ h1 {
 .feature-card {
   padding: 1rem;
   border: 1px solid var(--line);
-  border-radius: 0.5rem;
+  border-radius: 0.75rem;
   background: var(--surface);
 }
 

本机交互路线:git add -p -- index.html 选择其标题块。 git add -p -- styles.css 可以接受第一个块并拒绝半径块。提示因 Git 版本而异;在回答之前检查内容,而不是记住的 y/n 序列。

确定性本机等效项是将以下完整补丁 outside 项目保存为 <selection.patch> 并将其仅应用于索引:

文件摘录 · diff
diff --git a/styles.css b/styles.css
--- a/styles.css
+++ b/styles.css
@@ -38,7 +38,7 @@
 }
 
 .hero {
-  max-width: 44rem;
+  max-width: 48rem;
   padding-block: 3rem;
 }
 
Command · bash
git add -- index.html
git apply --cached --check "<selection.patch>"
git apply --cached "<selection.patch>"
git diff --cached -- styles.css

在夹具中检查/应用都默默地成功了。最终查询打印:

输出
diff --git a/styles.css b/styles.css
index d443c7e..4dc8369 100644
--- a/styles.css
+++ b/styles.css
@@ -38,7 +38,7 @@ footer {
 }
 
 .hero {
-  max-width: 44rem;
+  max-width: 48rem;
   padding-block: 3rem;
 }
 

git show :styles.css 必须等于上面完整的 CSS-02-INDEX。工作文件仍必须等于完整的 CSS-02-WORKING。 --cached patch 命令都不会写入有效的 CSS。

本机提交替代方案,应用程序成功后不重复:

Command · bash
git commit --quiet -m "feat: refine the hero and card spacing"
git status --short
git diff -- styles.css

安静提交:exit 0,无输出。状态:

输出
 M styles.css

完整的剩余工作差异:

输出
diff --git a/styles.css b/styles.css
index 4dc8369..6382365 100644
--- a/styles.css
+++ b/styles.css
@@ -56,7 +56,7 @@ h1 {
 .feature-card {
   padding: 1rem;
   border: 1px solid var(--line);
-  border-radius: 0.5rem;
+  border-radius: 0.75rem;
   background: var(--surface);
 }
 

结果

本课结束时:main 上的三个提交。 HEAD/index 包含新的标题和更宽的英雄,但半径仍然是 0.5rem;工作半径为0.75rem。只有 styles.css 具有未暂存的修改。无需远程、合并或变基。可选的笔记本/干净替代品不会取代此检查点。

常见错误

  • 仅选择替换的添加的一半:不一定是预期的补丁。
  • 暂存整个 CSS 文件:也包括半径。
  • 将目标索引 CSS 粘贴到工作 CSS 上:会丢失有意单独的编辑。
  • 现在进行清理提交:与第 8 课的起始任务相矛盾。

如果出现问题

使用缓存/工作比较来诊断索引不匹配。在提交之前,Unstage Lines/Hunk 可以更改选择,而不会放弃工作编辑。如果 Git 拒绝格式错误或过时的补丁,请停止;不要强迫它。重新读取当前文件并重新选择准确的内容。失败的提交/挂钩不允许跳过挂钩。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    猛男的定义是什么?

    选择一个答案。

  2. 第 2 题,共 6 题

    到阶段 44rem → 48rem,哪些线属于?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    部分选择后,索引中的宽度和半径是多少?

    选择一个答案。

  4. 第 4 题,共 6 题
    必填

    如果您在提交之前还设置了 radius,还剩下什么?

    选择一个答案。

  5. 第 5 题,共 6 题

    外部保存会更改选定的差异。什么是安全的?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    检查完成的检查点。哪些证据相符?

    选择每个适用的答案。

0 个(共 6 个)正确

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

在此浏览器中检查。

练习

使用完整文件解释三种不同的半径/宽度状态。更改的输入:如果您还暂存半径对,则下一次提交将包含 CSS 更改并且不会留下 CSS 差异。仅在单独的重播中进行测试;保留第 8 课的规范半径编辑。

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

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

回顾

  • 选择与预期更改相匹配的范围。
  • 验证完整的准备文件和剩余的工作差异。
  • 将独立有用的工作分开而不破坏它。

术语表介绍

猛男 — كר;选定的行 — 选项;舞台 — ЕЇив;取消舞台 — ?????????????????????????????????补丁 — ???;索引 — 索引。

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 准备一份零钱,同时 保留下一张。
  2. 附近的编辑可以属于 到不同的意图。
  3. 保存标题和 CSS 选择提交之前进行编辑。
  4. 在选择其中之一之前请先阅读这两项更改。
  5. 从孤立的开始 标题替换。
  6. 上演这个头条大佬, 不是不相关的文件更改。
  7. 保持完整的差异可见 用于线路选择。
  8. 替代品包括 删除并添加了行。
  9. 暂存宽度对,同时 将半径留在外面。
  10. 检查准备的内容并 其余内容分开。
  11. 取消暂存修复选择 而不丢弃工作文本。
  12. 整体选择是等效的 只为这个大块头。
  13. 清除复选框不会 取消暂存或删除内容。
  14. 原生补丁更新了 索引,而不是工作文件。
  15. 验证所选内容是否完整 文件,不仅仅是一个亮点。
  16. 半径属于哪个 准备好的快照?
  17. 提交标题和宽度, 留下半径供以后使用。
  18. 剩下的CSS编辑 是预期的结果。
  19. 下节课会记录 独立半径编辑。
  20. 如果您也选择半径, CSS diff 中没有任何内容。
  21. 更改后的差异需要新的 选择,而不是强制应用。
  22. 不要丢弃有用的工作 修复分阶段选择。
  23. 列出已准备好的和剩余的 在继续之前进行编辑。
  24. 保留半径编辑 下一个显式提交。