跳至内容
GitTree

课程 11 · 日常工作

获取队友的更改而不替换您的页面

接收 Leo 的真实页脚提交,同时保持主页面、索引和原始工作页面不变。然后在单独的重播中检查陈旧引用修剪,以便服务器删除不会与本地清理混淆。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 YouTube 上观看

你将学到什么

  • 解释为什么获取的远程跟踪 ref 可以前进,而 main 却不能。
  • 比较获取的页脚,无需检查或集成它。
  • 当工作页面具有重叠的本地编辑时预测获取行为。
  • 区分修剪本地陈旧引用和删除服务器或本地分支。

开始之前

从第 10 课结束的地方开始:原始 main/H6 签出,六个提交,包括 docs/remotes.md、clean、跟踪 origin/main/H6。单独的本地裸源只有 main/H6。功能/定价卡/F1 仍然是本地的,没有上游或发布。保持演示的后台获取关闭(repo.autoFetchInterval = 0)以捕获真实的之前/之后。不要使用第 4 课的补充克隆。

为队友使用新的同级 gittree-features-leo;如果目的地已经存在则停止。所有存储库都是 GitTree 功能的一次性副本,在每个源签出之外。该视频是在 Ubuntu 24.04 上使用 Git 2.52.0 和 GitTree 2.0 录制的:Leo 的提交和推送、stale-ref 副本的准备以及在终端中运行的检查;获取、图表、比较引用、文件视图和修剪远程都是在应用程序中完成的。 macOS 或 Windows 上没有运行任何内容,并且 Ubuntu 是唯一记录的 Linux 系统。 GitTree的源楼层是Git 2.39.0。此本地 Git 传输不需要提供程序、专业版/试用版或 API 凭据。

概念

Fetch 获取对象并更新获取的知识。在这里,服务器的 main 前进到 Leo 的 H7,但原始的 origin/main 仍然是 H6,直到获取。针对过时的源/主的零落后计数并不能证明服务器未更改。

获取后,origin/main 名称为 H7,而本地 main 和 HEAD 仍为 H6。索引和工作页面也仍然是H6。读取页脚差异是检查,而不是拉取、签出、合并或变基。 “后面”衡量的是祖先,而不是有多少文件或行不同。

Pull is fetch plus a second step. git pull 运行提取,然后将到达的内容集成到当前分支中(快进、合并或变基)。单独获取在上半部分之后停止,这就是为什么它永远无法更改您的文件。第12课故意选择了第二步。

根据 fetch/refspec 规则,Pruning 删除相应服务器分支已消失的远程跟踪引用。它本身不会删除该服务器分支、擦除本地分支或删除每个标签。源的 Fetch All 请求已启用修剪;因此,下面其本机等效项包括 --prune。 Prune Remote 是一个单独的命名远程操作,仅在单独准备的陈旧引用副本中演示。

国家效应

步骤原始头/主索引/作品起源/主要独立的服务器主
输入H6H6页面H6H6
利奥承诺并推动他的克隆人H6不变H6,现已过时H7
原始获取全部H6不变H7H7
检查差异H6不变H7H7

没有添加原始笔记本提交:真正的项目操作是获取的引用更新。局部特征仍然指向F1。

完整文件输入

仅在 Leo 的克隆中,将 index.html 替换为完整的第一个正文。他的主题是docs: add Leo's review reminder;作者/提交者 Leo Okafor <leo@example.com>。更改的输入正文是单独的原始副本工作编辑,而不是第二个规范提交。

文件摘录 · 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. Review one change at a time.</p></footer>
  <script type="module" src="site.js"></script>
</body>
</html>

单独的脏获取重播 — HTML-DIRTY-FETCH

这个完整的正文仅适用于单独的更改输入重播,而不是规范的原始内容。

文件摘录 · 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">Inspect the update before integrating it.</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>

在GitTree

  1. 打开原来的主选项卡;检查其存储库身份和干净状态。确认后台获取覆盖仍为 0。在捕获之前状态之前,请勿更改源签出或自动获取。
  2. 使用下面的 T1 准备 Leo 的克隆和精确的页脚提交,明确标记为 native teammate preparation。他的推送更新了本地裸服务器,而不是原始的获取记录。不涉及托管帐户或模拟提供商响应。
  3. 在获取之前,运行 T2。尽管直接服务器查找命名了不同的实际 SHA,Main 和 origin/main 在 H6 上仍然一致。工作页面仍然有旧的页脚。
  4. 使用 Command+Shift+P 打开调色板(在 Ubuntu 上按 Ctrl+Shift+P)并选择 Fetch All 一次; Command+Shift+F (Ctrl+Shift+F) 是快捷键。等待真实的运行和结果;不要单击拉动。对于一个源,右键单击 origin → Fetch Remote 是等效的,而不是第二次所需的提取(未拍摄)。
  5. 在图表中选择新获取的提交 docs: add Leo's review reminder,并检查真实主题和 Leo 元数据。本地 main/HEAD 标签保留在其早期提交。选择图表行不是结账。
  6. 调色板 Compare References… 打开 Compare References。 Old side = 主要; New side = 来源/主要; What to compare = The two endpoints;选择Compare。仅期待index.html,并添加确切的页脚提醒。不要使用合并基/日志集术语来进行此端点树比较。
  7. Show Files(在 Ubuntu 上按 Command+Shift+E、Ctrl+Shift+E);选择工作index.html并输入。它的页脚仍然是原来的。选择 Back to Graph,然后选择调色板 Show Working Changes:已暂存/未暂存列表仍为空。无需本地保存、提交或集成。
  8. 以 6 次提交结束 main,以 7 次提交结束 origin/main,以 count0/1 和 clean work/index 结束。保留未发布的本地功能。不要通过强行推动来“修复”落后。
  9. Separate stale-ref replay only: 如下所述准备 B,而不是原来的。首先运行原生修剪试运行。从 New Tab (Ctrl+T) 打开 B,其 Open gittree-features-prune 行位于“最近的存储库”下。在 B 的选项卡中,右键单击侧面板中名为 origin → Prune Remote。应用程序直接调度该操作;没有发明预览或确认对话框。观察起源/实践/陈旧消失,而本地保持陈旧和所有工作字节保留。

Command 键和弦来自应用程序的键盘映射; Ctrl 形式是在 Ubuntu 上使用的形式。队友和服务器的准备工作是终端中的本机工作,而不是应用程序创建的托管项目。

在航站楼

除非明确使用 -C 命令,否则以下所有命令均以 original isolated gittree-features 开头。本机原始获取命令是应用程序操作的替代方案,而不是在其之后重复的突变。

T1——真正的队友准备

Command · bash
git clone --quiet --branch main "$(git remote get-url origin)" ../gittree-features-leo
git -C ../gittree-features-leo config user.name "Leo Okafor"
git -C ../gittree-features-leo config user.email leo@example.com
git -C ../gittree-features-leo config commit.gpgsign false

新的克隆存在,main 被签出,并且仅更改其本地身份。在该克隆中,仅更改页脚行,使整个文件等于 HTML-LEO-FOOTER(视频使用一个 sed 命令执行此操作;将完整正文保存在编辑器中会得到相同的文件),然后:

Command · bash
git -C ../gittree-features-leo add -- index.html
git -C ../gittree-features-leo commit --quiet -m "docs: add Leo's review reminder"
git -C ../gittree-features-leo push --quiet origin main

一切都在默默地成功。这是一次真正的 Git 推送到一次性本地裸源;没有触及任何互联网帐户或生产数据。

T2 — 区分陈旧的本地知识和服务器状态

Command · bash
git rev-list --left-right --count main...origin/main
git rev-parse refs/heads/main
git rev-parse refs/remotes/origin/main
git ls-remote --heads origin refs/heads/main

计数打印:

输出
0	0

接下来的两个 SHA 输出是相等的 H6 身份; ls-remote 打印实际不同的 H7 SHA 加上 refs/heads/main。 SHA 随提交元数据的不同而变化,因此此处不会打印固定的假哈希值。此直接服务器查询不会更新 origin/main。

T3 — 无需集成和验证即可获取

Command · bash
git fetch --all --prune --quiet

观察到:退出 0,没有标准输出。 GitTree 的源启用对此请求的修剪;该命令反映了该选择。

Command · bash
git symbolic-ref --short HEAD
git rev-list --count main
git rev-list --count origin/main
git rev-list --left-right --count main...origin/main
git log -1 --format="%s%n%an <%ae>%n%cn <%ce>" origin/main
git diff --name-only main origin/main
git status --short

在最终状态之前输出,将三行元数据结果分组:

输出
main
6
7
0	1
docs: add Leo's review reminder
Leo Okafor <leo@example.com>
Leo Okafor <leo@example.com>
index.html

最终的短状态是空出口 0。Main 的 SHA、索引中的完整 index.html 及其完整磁盘字节在前后进行比较并保持相同。获取和图形检查均未检查 H7。

Command · bash
git diff main origin/main -- index.html

完整观察到的差异:

输出
diff --git a/index.html b/index.html
index eebd082..1e4cfde 100644
--- a/index.html
+++ b/index.html
@@ -34,7 +34,7 @@
       </div>
     </section>
   </main>
-  <footer><p>Built by a fictional team for GitTree Learn.</p></footer>
+  <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>

T4 — 更改输入:本地脏页

仅在预取原始文件的单独同一项目副本中,保存完整的 HTML-DIRTY-FETCH,而不进行暂存。 Leo的服务器H7已经存在:

Command · bash
git fetch --all --prune --quiet
git status --short
git show :index.html
git rev-list --left-right --count main...origin/main

获取成功;状态:

输出
 M index.html

完整的 git show 输出仍然是旧的记录/索引文件,而不是脏工作版本。最终计数为0/1。工作磁盘文件仍为exactly HTML-DIRTY-FETCH。重叠的文件名本身不会产生获取冲突;后期整合有不同的前提条件。视频将索引和工作文件与 grep -n 'hero-copy\|<footer>' 进行比较,而不是打印整个文件;重播自己的检查确认工作文件等于 HTML-DIRTY-FETCH。

T5 — 过时的远程跟踪参考,单独的 B

使用服务器 main/H7 创建一个隔离的同一项目 B 原始版本和一个单独的 B 裸目标。使用其测量的文件 URL 将 B only 指向该目标。不要重新定位 A。

从原始演示文件夹中,准备两个新的不存在的同级目标。这些命令将相同的项目克隆到 B 及其自己的服务器中,而不会重定向 A:

Command · bash
git clone --quiet --bare --single-branch --branch main --no-local ../gittree-features-origin.git ../gittree-features-prune-origin.git
git clone --quiet --single-branch --branch main --no-local . ../gittree-features-prune
PRUNE_URL="$(node --input-type=module -e "import path from 'node:path'; import {pathToFileURL} from 'node:url'; console.log(pathToFileURL(path.resolve('../gittree-features-prune-origin.git')).href);")"
git -C ../gittree-features-prune remote set-url origin "$PRUNE_URL"
git -C ../gittree-features-prune config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
git --git-dir=../gittree-features-prune-origin.git branch practice/stale main
git -C ../gittree-features-prune fetch --prune --quiet origin
git -C ../gittree-features-prune branch keep-stale origin/practice/stale
git --git-dir=../gittree-features-prune-origin.git branch --delete --quiet practice/stale

单分支 B 克隆最初仅获取主分支。其显式的remote.origin.fetch分配恢复了原始演示的通配符分支映射,因此可以获取practice/stale;它只改变B。停止任何失败的准备命令。在实际应用获取之前,将 B 的特定于存储库的后台获取间隔设置为 0。一次性服务器分支现在不存在,而 B 仍然具有其获取的记录和一个单独的本地保持过时分支。以下命令明确以 B 为目标:

Command · bash
git -C ../gittree-features-prune remote prune --dry-run origin
git -C ../gittree-features-prune remote prune origin
git -C ../gittree-features-prune for-each-ref --format='%(refname)' refs/remotes/origin/practice/stale
git -C ../gittree-features-prune show-ref --verify --quiet refs/heads/keep-stale

在其变量 URL 行后观察到 preview excerpt:

输出
 * [would prune] origin/practice/stale

观察到的execution excerpt:

输出
 * [pruned] origin/practice/stale

for-each-ref 为空 exit 0; show-ref 是静默退出 0,证明本地 keep-stale 仍然存在。 B的主SHA和工作页面保持不变;服务器主要仍然是H7。完整的本机成绩单包括 Pruning origin 和测量的文件 URL;这些特定于机器的路径不是在这里制作的。

不要在 stale-ref 准备和 Prune Remote 之间插入正常的 Fetch All:Fetch All 已经修剪,不为单独的演示留下过时的候选者。

结果

Where you end: 原始 main/H6 仍通过六次提交和旧页脚进行签出; origin/main/H7 记录 Leo 的第七次提交;服务器 main/H7 被 fetch 改变; main 轨道是 origin/main 并且是落后的。索引/工作清洁; feature/pricing-cards/F1 仍然是本地/未发布的。 B/C 分支、脏文本和修剪准备不属于 A。没有额外的 docs/fetch-and-prune.md 提交。

常见错误

  • 调用pre-fetch0/0计数当前服务器的真实情况。
  • 期望获取的页脚自动替换工作页面。
  • 使用 Pull 或 checkout 使获取记录看起来成功。
  • 期望仅通过提取就丢弃脏页或发生冲突。
  • 将 prune 解释为删除远程存储库或本地保持陈旧的存储库。

如果出现问题

丢失文件夹、错误 URL 或权限失败意味着检查预期来源和实际错误,而不是重置历史记录或覆盖目的地。网络/助手/信任拒绝并不是零更新的证据;记录其实际构建/消息并仅解决所述原因。受限方式可以拒绝运输;只相信经过审查的一次性实验室,而不是随机存储库来通过胶片。

如果原来的 main 已移动或页脚发生更改,请停止并检查是否运行了 Pull、checkout 或外部编辑。不要硬重置来掩盖原因。在准备新的演示检查点之前保留意外状态。

如果没有保留过时的引用,请检查较早的 Fetch All 是否已修剪它。重新准备B;不要发明消失的行或删除有用的服务器分支。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    Leo推了H7,但你还没有取到。起源/主要名称是什么?

    选择一个答案。

  2. 第 2 题,共 6 题

    哪些观察结果属于规范获取结果?

    选择每个适用的答案。

  3. 第 3 题,共 6 题

    fetch 之后,main 有 6 和 origin/main7,其中 H6 作为 H7 的父级。什么是主要...起源/主要计数?

    选择一个答案。

  4. 第 4 题,共 6 题

    更改输入:保存 HTML-DIRTY-FETCH 而不分段,然后获取 H7。会发生什么?

    选择一个答案。

  5. 第 5 题,共 6 题

    B 的服务器分支已删除,但 B 具有 origin/practice/stale 和本地 keep-stale。修剪可以去除什么?

    选择一个答案。

  6. 第 6 题,共 6 题

    需要同时进行哪些检查?

    选择每个适用的答案。

0 个(共 6 个)正确

您正确回答了每个必需的问题。

在此浏览器中检查。

练习

预测获取后的两个原始页面版本:index 和 work 都保持 H6,而新的远程树保存 Leo 的页脚。在单独的脏重播中,验证完整磁盘文本是否存在并且不会产生冲突。在 B 中,解释为什么 keep-stale 能够在修剪后幸存下来。仅在 clean0/1 检查点处结束原始文件。

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

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

回顾

  • Fetch 刷新本地知识,无需集成分支。
  • 干净状态并不意味着遥控器是最新的。
  • 修剪本地跟踪引用与删除本地或服务器分支不同。

术语表介绍

获取 — ???;修剪——修剪;过时的远程跟踪参考 — ????????????后面——同义词;端点比较 — 比较。

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 接收更新,无需 替换当前页面。
  2. 保持后台抓取关闭 对于这个之前和之后的拍摄。
  3. 准备Leo的单独克隆 具有虚构的本地身份。
  4. Leo 记录并推送页脚 提醒当地原产地。
  5. 当您的服务器移动时 获取的记录留在后面。
  6. 这些计数使用您本地获取的 参考,不是实时服务器快照。
  7. 哪个裁判将移动,以及 将保留哪个文件版本?
  8. 获取所有已配置的遥控器; 这里只有起源。
  9. 之前等待Git的结果 将更新视为收到的更新。
  10. 选择 Leo 的提交 不检查它。
  11. 将 main 与获取的进行比较 树而不移动任何参考。
  12. 取出的树有提醒; 您的工作页面仍然没有。
  13. 原始工作文件 保留其旧页脚。
  14. 清洁工作的改变不会 意味着您的分支是最新的。
  15. 验证六个本地提交,七个 获取的提交和后面的一个。
  16. 无需获取更新的知识 整合文件内容。
  17. 相同的本地编辑 文件在这次提取中幸存下来。
  18. 服务器分支已经 在这个修剪示例之前就已经消失了。
  19. 预览过时的跟踪 删除之前请参考。
  20. 删除陈旧的本地跟踪 参考,而不是当地的救援部门。
  21. 当地分行和 工作页面保持不变。
  22. 之前的获取可能已经有 删除了陈旧的跟踪参考。
  23. 保持原件干净并放在后面 一;请勿拉或用力推。
  24. 接下来,检查目的地 在发布分支之前。