课程 10 · 日常工作
连接远程设备,不要将其与上游设备混淆
添加本地裸源,获取其主分支并故意选择本地主轨道。证明远程名称、远程跟踪引用和上游设置是三个不同的东西。
- 级别: 中级
- 阅读 4 分钟
- 6 分钟的视频
- 已更新
- 在这节课之前: 创建一个功能分支并仅退役一次性引用
进度已保存在此浏览器中。
播放时会加载来自 YouTube 的视频(隐私增强模式)。
你将学到什么
- 区分origin、origin/main 和main 的上游配置。
- 解释一下每次更改时添加远程、获取和选择上游的内容。
- 将 GitTree 连接到真实的本地裸存储库,无需提供者凭据。
- 证明该功能分支仍然是本地且未发布的。
开始之前
从第 9 课结束的地方开始,在原始的 gittree-features 中:签出的功能/定价卡有其工作流程卡提交 F1; main 通过历史文档 H5 有 5 次提交。两者都是干净的,不存在远程并且 dist 仍然被忽略。这些是演示参考,绝不是更改此网站分支的说明。
该视频是在 Ubuntu 24.04 上使用 Git 2.52.0 和 GitTree 2.0 录制的:文档、远程、获取和上游均在应用程序中完成;裸目的地、仅添加状态和检查在终端中运行。 macOS 或 Windows 上没有运行任何内容,并且 Ubuntu 是唯一记录的 Linux 系统;下面的 Command 键和弦来自应用程序的键盘映射。 GitTree检查的Git版本是2.39.0。登录后,本地 Git 传输和上游配置都属于免费计划;提供商集成是一个不同的门控功能。
在每个源结帐之外保留一个空的同级目的地 gittree-features-origin.git。不要替换现有目录。裸存储库将从该项目的主目录中播种;它不是 GitLab 安装、GitHub 存储库、备份服务或 CI 运行程序。如果克隆目标存在,请停止并识别它,而不是删除它。
对于仅添加预测,必须在此记录存储库中关闭后台提取。使用 Command+ 打开 Preferences(Ctrl+,在 Ubuntu 上),选择存储库自身名称下的 gittree-features 页面,然后在 Auto-fetch interval 中输入 0,然后输入 Apply,等待 Saved 和 Exit Preferences。应用程序将其存储在它自己的每个存储库设置中,而不是存储在 Git 的配置中。记下之前的值以便稍后恢复;不要更改应用程序范围的间隔或其他存储库。
概念
remote 是存储库本地配置,命名传输地址和获取规则。起源是一个约定,而不是一个内置的中央权威。添加它会写入此演示的配置;它不会联系地址、创建目的地或上传分支。
诸如 refs/remotes/origin/main 之类的 remote-tracking ref 是通过获取更新的本地记录。它不是服务器分支 refs/heads/main 本身。添加origin后,这里就没有origin/main了。 Fetch 获取对象/引用,但不会切换 HEAD、合并、变基或替换工作页面。
upstream 是为本地分支存储的关系。这里branch.main.remote = origin 和branch.main.merge = refs/heads/main。选择它会告诉后面的命令哪些获取了分支主轨道。它不会创建提交、获取丢失的历史记录或发布功能/定价卡。
这个类比是地址簿条目、您收集的最后一条消息以及要跟踪的对话的选择。它们是相关的,但保存地址并不代表接收或发送消息。
国家效应
| 行动 | 工作树/索引 | 本地参考/配置 | 服务器 |
|---|---|---|---|
| 切换到主 | 选择H5的录音文件 | HEAD 连接到主设备 | 不变 |
| 提交文档 | 索引/工作符合H6 | H6 的主要进步 | 不变 |
| 准备裸副本 | 原版不变 | 原作还没有出处 | 单独的本地主线从 H6 开始 |
| 添加远程... | 不变 | 仅原始 URL/获取配置 | 不变 |
| 获取全部 | 不变 | origin/main 变为 H6;获得的物品 | 已阅读,未修改 |
| 设置上游... | 不变 | main 的远程/合并配置集 | 不变 |
F1 保留本地功能。现在,主要/功能图在 H5 的每一侧都有一个不同的提交:主要文档、功能工作流程卡。两者都不是合并。
完整的项目变更
切换到主 before 创建此文件。使用完整的 UTF-8/LF 正文和最后的换行符创建 docs/remotes.md:
# GitTree Features remotes
origin names a separate local bare repository used only for this course.
Its file:// URL is a transport address, not a GitLab project or a login.
main tracks origin/main after an explicit fetch and upstream selection.
origin/main is a local record of the last fetched remote main.
Adding a remote does not fetch, push or publish any branch.
feature/pricing-cards remains local and has no upstream in this checkpoint.
No credentials or machine-specific absolute paths are stored in this document.提交主题:docs: record remotes-and-upstreams practice。作者/提交者:GitTree 演示 <demo@example.com>。没有第二个练习笔记本或额外的提交属于此检查点。
在GitTree
- 在原始选项卡中,右键单击本地 main → Checkout main。期望历史文档时代页面,没有工作流程部分,并且状态干净。如果出现脏开关对话框,请 Cancel 并检查意外的工作。
- 使用 Command+Shift+P 打开调色板(在 Ubuntu 上为 Ctrl+Shift+P)。选择New File…。在 Path from the project folder 中,输入 docs/remotes.md,然后输入 Create。粘贴上面的完整内容和 Save / Command+S。等待磁盘保存完成。
- 选择 Back to Graph,然后选择调色板 Show Working Changes。查看 docs/remotes.md 并激活 Stage File。在 Summary 中输入确切的主题,将描述留空并关闭普通可选行为。单击 Commit Changes to 1 File 一次,或者单击 Command+Enter。验证实际的第六次主要提交。
- 使用下面的终端段 T1 准备单独的裸存储库。这是一个明确标记的 native preparation 步骤:没有发明 GitTree“创建托管项目”按钮。
- 运行 T2 以获取实际的 file:// URL。经过检查的 GitTree URL 解析器接受文件 URL,而不是普通的裸文件系统路径,尽管本机 Git 可以接受。使用生成的 URL,并对任何空格进行百分比编码。切勿将 shell 命令粘贴到远程 URL 字段中。
- 调色板 Add Remote… 打开 Add a remote。输入 Name = 来源和 URL = 测量的文件 URL。选择Add Remote。添加表单没有单独的 Push URL 字段;属于 Edit Remote…。预计已配置 origin,但尚未获取 origin/main。
- 使用 Fetch All 从调色板中获取(Command+Shift+F,在 Ubuntu 上为 Ctrl+Shift+F)。在第一次获取之前,侧面板的远程组根本没有列出来源,因此没有可以右键单击的行;仅使用一个遥控器,“Fetch All”即可获取它。等待实际结果。期望 origin/main 具有与 main 相同的真实 SHA; HEAD 和文件保持原样。
- 右键单击本地 main,打开 Upstream 子菜单并选择 Set Upstream…。在 What should main track? 中,选择 Upstream branch = origin/main,然后选择 Track。此named-ref操作不是通用调色板命令。 Cancel 保持关系不变;不要选择Track Nothing。
- 使用 T3 和 T4 进行验证。保留主要检查状态,功能/定价卡存在但未发布,并且没有正在进行的操作。请勿按“推”、“拉”、“强制推”……或远程删除命令来“完成”连接。
Ordinary options off 表示未选中“修改先前的提交”;跳过挂钩、添加签署者、不同作者、提交后推送并允许空提交;没有共同作者。等待确认完成而不是单击两次。
在航站楼
运行隔离的 gittree-features 内的所有命令,而不是源签出。应用程序/本机突变是替代方案,而不是应用程序成功后重复的步骤。
T1 — 记录文档并仅在本地源上准备主要内容
将完整文档保存到主目录后:
git switch --quiet main
git add -- docs/remotes.md
git commit --quiet -m "docs: record remotes-and-upstreams practice"
git clone --quiet --bare --single-branch --branch main --no-local . ../gittree-features-origin.git所有命令在本机夹具中均默默成功。克隆创建一个 new,仅将裸存储库与主存储库分开;它没有在原始配置中配置origin。 --no-local 避免硬链接本地对象复制快捷方式。这份准备记录中没有任何推动。
如果应用程序已经提交了文档,请省略前三个命令。切勿将同一个文档提交两次。
T2 — 添加,然后获取,然后选择上游
生成一个真正的平台正确的、百分比编码的 URL:
ORIGIN_URL="$(node --input-type=module -e "import path from 'node:path'; import {pathToFileURL} from 'node:url'; console.log(pathToFileURL(path.resolve('../gittree-features-origin.git')).href);")"
printf '%s\n' "$ORIGIN_URL"实际输出是一个以 /gittree-features-origin.git 结尾的特定于计算机的文件 URL。其根不同; file://<lab-root>/gittree-features-origin.git 是解释性符号,不是虚构的终端输出或要粘贴的文字 URL。 ORIGIN_URL 是一个 shell 变量,而不是凭证。
git remote add origin "$ORIGIN_URL"
git config --get remote.origin.fetch
git for-each-ref --format='%(refname)' refs/remotes/origin补充者沉默了。配置查询打印:
+refs/heads/*:refs/remotes/origin/*最后的 for-each-ref 不打印任何内容:添加遥控器并没有获取遥控器。
git fetch --quiet origin
git branch --set-upstream-to=origin/main main默默地获取成功。实际上游输出:
branch 'main' set up to track 'origin/main'.T3 — 证明原件的最终状态
git symbolic-ref --short HEAD
git rev-parse --abbrev-ref 'main@{upstream}'
git rev-list --left-right --count main...origin/main
git log -1 --format=%s origin/main
git rev-list --count main
git status --short前五个查询的输出(按顺序):
main
origin/main
0 0
docs: record remotes-and-upstreams practice
6最终的短状态为空,退出 0。两个零之间的制表符分隔只能从 main 和只能从 origin/main 访问的提交;匹配提示并不能证明未来的提取是不必要的。
T4 — 将实际的裸存储库与其本地跟踪引用区分开来
git --git-dir=../gittree-features-origin.git rev-parse --is-bare-repository
git --git-dir=../gittree-features-origin.git for-each-ref --format='%(refname)' refs/heads
git ls-remote --heads origin refs/heads/feature/pricing-cards
git config --get branch.feature/pricing-cards.remote第一个查询打印 true;第二个打印 refs/heads/main。第三个是无声的,出口0:feature/pricing-cards was not published。第四个是静默,退出 1:不存在功能上游设置。预期的缺席并不是提取失败。
独立解决三个提示:
git rev-parse refs/heads/main
git rev-parse refs/remotes/origin/main
git --git-dir=../gittree-features-origin.git rev-parse refs/heads/main所有三个实际的 SHA 都同意。切勿用 H6 代替其真实的 SHA 输出。
结果
Where you end: checkout main 有六次提交,仅包括新的 docs/remotes.md。一个单独的本地裸原点主要位于同一 H6。原始版本已配置 origin 并已获取 refs/remotes/origin/main ;主要曲目起源/主要。索引/工作清洁;被忽略的 dist 可能仍然存在。本地功能/定价卡仍然指向 F1,并且没有上游或服务器分支。没有发生合并、拉取、托管项目、登录或 CI 运行。
常见错误
- 将 origin 视为特殊服务器:它是一个选择的本地名称。
- 期望添加远程创建服务器或获取其分支。
- 将纯路径粘贴到 GitTree 的 URL 字段中:改为生成文件 URL。
- 选择真实公司的远程,使用带有令牌的 URL,或重用现有的裸目录。
- 在仍在使用该功能时创建文档:它将记录错误分支的历史记录。
如果出现问题
在获取之前,本机上游选择失败,因为 origin/main 不存在。隔离的更改输入重放实际上运行:
git -c advice.setUpstreamFailure=false branch --set-upstream-to=origin/main main观察到 stderr,退出 128:
fatal: the requested upstream branch 'origin/main' does not exist分支尖端和工作保持不变。根据应用程序的源代码(未拍摄),上游表单没有获取的选项,并且其 Track 控件无法通过 There are no remote-tracking branches yet. Fetch first. 不将本机致命消息绘制为应用程序对话框。获取想要的遥控器,然后故意选择 origin/main。在本课中是 Fetch All。
丢失的本地目录、错误的 URL 或权限失败无法通过强制推送或禁用安全性来修复。取消,检查 Edit Remote…,验证实际目标并仅重试预期的提取。如果已经有原点,则检查它;不要盲目覆盖或删除它。删除远程会更改本地配置/跟踪,而不是服务器本身,并且对于规范课程来说是不必要的。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
正确回答所需的问题以完成课程。
在此浏览器中检查。
练习
解释为什么在添加远程后立即缺少 origin/main。在单独的同项目重放中,尝试在提取之前选择它,然后提取并选择它成功。验证 main 的 SHA 和完整的 index.html 字节在任一配置操作中均未发生更改。在原始版本中,证明 main/origin/main 一致,并且裸服务器中仍然不存在该功能。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- 遥控器配置地址; fetch 获取其 refs;上游选择分支关系。
- origin/main 是本地获取的知识,而不是服务器分支本身。
- 连接 main 未发布该功能或更改其工作页面。
有关的
术语表介绍
远程 — 远程控制;远程跟踪参考 — ???上游 — 上游;裸存储库 — ambiguity;获取 — 阿尔巴;交通 — 交通.
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 连接遥控器,然后选择 故意上游。
- 该功能本地存在; 它尚未发表。
- 仅禁用后台抓取 在此记录存储库中。
- 写之前先切换到main 运输单据。
- 保存完整文档,无需 计算机特定的路径或凭据。
- 暂存运输文件 在主要方面,而不是在功能方面。
- 该文档添加了 在 main 上第六次提交。
- 准备一个单独的裸副本 主要用于当地交通。
- 这个目的地主要有 但没有功能分支。
- 原始而空旷的目的地 是单独的存储库。
- 生成文件 URL 预期的当地目的地。
- 保存地址不取 分支或上传功能。
- 打开远程对话框 原始存储库。
- 将其命名为 origin 并验证 完整的目的地。
- 遥控器已配置;它的 尚未获取分支。
- 当获取规则存在时 跟踪参考查询为空。
- 选择缺失的上游 在不移动 main 的情况下失败。
- 是否选择上游 取代抓取?事实并非如此。
- 获取遥控器的主线,无需 切换当前分支。
- 起源斜线主要是你的 本地获取的记录。
- 抓取不是合并, 重新调整或替换页面。
- 选择关系 指定的当地主要分支机构。
- 单独选择该选项是 不是已确认的关系。
- 确认main的上游 而不移动其提交。
- 验证 main 及其上游, 匹配提示和清洁工作。
- 空的服务器功能查询不会 并不意味着本地功能丢失了。
- 地址、获取的记录和上游 设置仍然是不同的事情。
- 纠正上游选择 无需重置历史记录。
- 验证原件和服务器 在继续之前先分开。
- 解释为什么缺少参考 需要获取,而不是推送。
- 本地裸遥控器不是 托管项目或管道。
- 接下来,获取队友的更新 保持您自己的文件不变。