课程 11 · 日常工作
获取队友的更改而不替换您的页面
接收 Leo 的真实页脚提交,同时保持主页面、索引和原始工作页面不变。然后在单独的重播中检查陈旧引用修剪,以便服务器删除不会与本地清理混淆。
- 级别: 初学者
- 阅读 5 分钟
- 6 分钟的视频
- 已更新
- 在这节课之前: 连接远程设备,不要将其与上游设备混淆
进度已保存在此浏览器中。
播放时会加载来自 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 是一个单独的命名远程操作,仅在单独准备的陈旧引用副本中演示。
国家效应
| 步骤 | 原始头/主 | 索引/作品 | 起源/主要 | 独立的服务器主 |
|---|---|---|---|---|
| 输入 | H6 | H6页面 | H6 | H6 |
| 利奥承诺并推动他的克隆人 | H6 | 不变 | H6,现已过时 | H7 |
| 原始获取全部 | H6 | 不变 | H7 | H7 |
| 检查差异 | H6 | 不变 | H7 | H7 |
没有添加原始笔记本提交:真正的项目操作是获取的引用更新。局部特征仍然指向F1。
完整文件输入
仅在 Leo 的克隆中,将 index.html 替换为完整的第一个正文。他的主题是docs: add Leo's review reminder;作者/提交者 Leo Okafor <leo@example.com>。更改的输入正文是单独的原始副本工作编辑,而不是第二个规范提交。
Leo 的index.html — HTML-LEO-FOOTER
<!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
这个完整的正文仅适用于单独的更改输入重播,而不是规范的原始内容。
<!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
- 打开原来的主选项卡;检查其存储库身份和干净状态。确认后台获取覆盖仍为 0。在捕获之前状态之前,请勿更改源签出或自动获取。
- 使用下面的 T1 准备 Leo 的克隆和精确的页脚提交,明确标记为 native teammate preparation。他的推送更新了本地裸服务器,而不是原始的获取记录。不涉及托管帐户或模拟提供商响应。
- 在获取之前,运行 T2。尽管直接服务器查找命名了不同的实际 SHA,Main 和 origin/main 在 H6 上仍然一致。工作页面仍然有旧的页脚。
- 使用 Command+Shift+P 打开调色板(在 Ubuntu 上按 Ctrl+Shift+P)并选择 Fetch All 一次; Command+Shift+F (Ctrl+Shift+F) 是快捷键。等待真实的运行和结果;不要单击拉动。对于一个源,右键单击 origin → Fetch Remote 是等效的,而不是第二次所需的提取(未拍摄)。
- 在图表中选择新获取的提交 docs: add Leo's review reminder,并检查真实主题和 Leo 元数据。本地 main/HEAD 标签保留在其早期提交。选择图表行不是结账。
- 调色板 Compare References… 打开 Compare References。 Old side = 主要; New side = 来源/主要; What to compare = The two endpoints;选择Compare。仅期待index.html,并添加确切的页脚提醒。不要使用合并基/日志集术语来进行此端点树比较。
- Show Files(在 Ubuntu 上按 Command+Shift+E、Ctrl+Shift+E);选择工作index.html并输入。它的页脚仍然是原来的。选择 Back to Graph,然后选择调色板 Show Working Changes:已暂存/未暂存列表仍为空。无需本地保存、提交或集成。
- 以 6 次提交结束 main,以 7 次提交结束 origin/main,以 count0/1 和 clean work/index 结束。保留未发布的本地功能。不要通过强行推动来“修复”落后。
- 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——真正的队友准备
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 命令执行此操作;将完整正文保存在编辑器中会得到相同的文件),然后:
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 — 区分陈旧的本地知识和服务器状态
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 — 无需集成和验证即可获取
git fetch --all --prune --quiet观察到:退出 0,没有标准输出。 GitTree 的源启用对此请求的修剪;该命令反映了该选择。
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。
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已经存在:
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:
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 为目标:
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/stalefor-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;不要发明消失的行或删除有用的服务器分支。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
您正确回答了每个必需的问题。
在此浏览器中检查。
练习
预测获取后的两个原始页面版本:index 和 work 都保持 H6,而新的远程树保存 Leo 的页脚。在单独的脏重播中,验证完整磁盘文本是否存在并且不会产生冲突。在 B 中,解释为什么 keep-stale 能够在修剪后幸存下来。仅在 clean0/1 检查点处结束原始文件。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- Fetch 刷新本地知识,无需集成分支。
- 干净状态并不意味着遥控器是最新的。
- 修剪本地跟踪引用与删除本地或服务器分支不同。
有关的
术语表介绍
获取 — ???;修剪——修剪;过时的远程跟踪参考 — ????????????后面——同义词;端点比较 — 比较。
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 接收更新,无需 替换当前页面。
- 保持后台抓取关闭 对于这个之前和之后的拍摄。
- 准备Leo的单独克隆 具有虚构的本地身份。
- Leo 记录并推送页脚 提醒当地原产地。
- 当您的服务器移动时 获取的记录留在后面。
- 这些计数使用您本地获取的 参考,不是实时服务器快照。
- 哪个裁判将移动,以及 将保留哪个文件版本?
- 获取所有已配置的遥控器; 这里只有起源。
- 之前等待Git的结果 将更新视为收到的更新。
- 选择 Leo 的提交 不检查它。
- 将 main 与获取的进行比较 树而不移动任何参考。
- 取出的树有提醒; 您的工作页面仍然没有。
- 原始工作文件 保留其旧页脚。
- 清洁工作的改变不会 意味着您的分支是最新的。
- 验证六个本地提交,七个 获取的提交和后面的一个。
- 无需获取更新的知识 整合文件内容。
- 相同的本地编辑 文件在这次提取中幸存下来。
- 服务器分支已经 在这个修剪示例之前就已经消失了。
- 预览过时的跟踪 删除之前请参考。
- 删除陈旧的本地跟踪 参考,而不是当地的救援部门。
- 当地分行和 工作页面保持不变。
- 之前的获取可能已经有 删除了陈旧的跟踪参考。
- 保持原件干净并放在后面 一;请勿拉或用力推。
- 接下来,检查目的地 在发布分支之前。