跳至内容
GitTree

课程 10 · 日常工作

连接远程设备,不要将其与上游设备混淆

添加本地裸源,获取其主分支并故意选择本地主轨道。证明远程名称、远程跟踪引用和上游设置是三个不同的东西。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 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 连接到主设备不变
提交文档索引/工作符合H6H6 的主要进步不变
准备裸副本原版不变原作还没有出处单独的本地主线从 H6 开始
添加远程...不变仅原始 URL/获取配置不变
获取全部不变origin/main 变为 H6;获得的物品已阅读,未修改
设置上游...不变main 的远程/合并配置集不变

F1 保留本地功能。现在,主要/功能图在 H5 的每一侧都有一个不同的提交:主要文档、功能工作流程卡。两者都不是合并。

完整的项目变更

切换到主 before 创建此文件。使用完整的 UTF-8/LF 正文和最后的换行符创建 docs/remotes.md:

文件摘录 · markdown
# 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

  1. 在原始选项卡中,右键单击本地 main → Checkout main。期望历史文档时代页面,没有工作流程部分,并且状态干净。如果出现脏开关对话框,请 Cancel 并检查意外的工作。
  2. 使用 Command+Shift+P 打开调色板(在 Ubuntu 上为 Ctrl+Shift+P)。选择New File…。在 Path from the project folder 中,输入 docs/remotes.md,然后输入 Create。粘贴上面的完整内容和 Save / Command+S。等待磁盘保存完成。
  3. 选择 Back to Graph,然后选择调色板 Show Working Changes。查看 docs/remotes.md 并激活 Stage File。在 Summary 中输入确切的主题,将描述留空并关闭普通可选行为。单击 Commit Changes to 1 File 一次,或者单击 Command+Enter。验证实际的第六次主要提交。
  4. 使用下面的终端段 T1 准备单独的裸存储库。这是一个明确标记的 native preparation 步骤:没有发明 GitTree“创建托管项目”按钮。
  5. 运行 T2 以获取实际的 file:// URL。经过检查的 GitTree URL 解析器接受文件 URL,而不是普通的裸文件系统路径,尽管本机 Git 可以接受。使用生成的 URL,并对任何空格进行百分比编码。切勿将 shell 命令粘贴到远程 URL 字段中。
  6. 调色板 Add Remote… 打开 Add a remote。输入 Name = 来源和 URL = 测量的文件 URL。选择Add Remote。添加表单没有单独的 Push URL 字段;属于 Edit Remote…。预计已配置 origin,但尚未获取 origin/main。
  7. 使用 Fetch All 从调色板中获取(Command+Shift+F,在 Ubuntu 上为 Ctrl+Shift+F)。在第一次获取之前,侧面板的远程组根本没有列出来源,因此没有可以右键单击的行;仅使用一个遥控器,“Fetch All”即可获取它。等待实际结果。期望 origin/main 具有与 main 相同的真实 SHA; HEAD 和文件保持原样。
  8. 右键单击本地 main,打开 Upstream 子菜单并选择 Set Upstream…。在 What should main track? 中,选择 Upstream branch = origin/main,然后选择 Track。此named-ref操作不是通用调色板命令。 Cancel 保持关系不变;不要选择Track Nothing。
  9. 使用 T3 和 T4 进行验证。保留主要检查状态,功能/定价卡存在但未发布,并且没有正在进行的操作。请勿按“推”、“拉”、“强制推”……或远程删除命令来“完成”连接。

Ordinary options off 表示未选中“修改先前的提交”;跳过挂钩、添加签署者、不同作者、提交后推送并允许空提交;没有共同作者。等待确认完成而不是单击两次。

在航站楼

运行隔离的 gittree-features 内的所有命令,而不是源签出。应用程序/本机突变是替代方案,而不是应用程序成功后重复的步骤。

T1 — 记录文档并仅在本地源上准备主要内容

将完整文档保存到主目录后:

Command · bash
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:

Command · bash
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 变量,而不是凭证。

Command · bash
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 不打印任何内容:添加遥控器并没有获取遥控器。

Command · bash
git fetch --quiet origin
git branch --set-upstream-to=origin/main main

默默地获取成功。实际上游输出:

输出
branch 'main' set up to track 'origin/main'.

T3 — 证明原件的最终状态

Command · bash
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 — 将实际的裸存储库与其本地跟踪引用区分开来

Command · bash
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:不存在功能上游设置。预期的缺席并不是提取失败。

独立解决三个提示:

Command · bash
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 不存在。隔离的更改输入重放实际上运行:

Command · bash
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…,验证实际目标并仅重试预期的提取。如果已经有原点,则检查它;不要盲目覆盖或删除它。删除远程会更改本地配置/跟踪,而不是服务器本身,并且对于规范课程来说是不必要的。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    您刚刚添加了原点。什么是起源?

    选择一个答案。

  2. 第 2 题,共 6 题

    本课中哪些陈述是正确的?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    添加 origin 后,您可以获取并设置 main 的上游。该页面的主页面没有工作流程部分。它应该发生什么?

    选择一个答案。

  4. 第 4 题,共 6 题
    必填

    更改输入:添加原点但跳过获取。尝试选择 origin/main 作为上游。会发生什么?

    选择一个答案。

  5. 第 5 题,共 6 题

    存在裸文件夹,但 GitTree 拒绝粘贴到 URL 中的纯路径。正确的下一步是什么?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    需要同时提供哪些证据?

    选择每个适用的答案。

0 个(共 6 个)正确

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

在此浏览器中检查。

练习

解释为什么在添加远程后立即缺少 origin/main。在单独的同项目重放中,尝试在提取之前选择它,然后提取并选择它成功。验证 main 的 SHA 和完整的 index.html 字节在任一配置操作中均未发生更改。在原始版本中,证明 main/origin/main 一致,并且裸服务器中仍然不存在该功能。

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

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

回顾

  • 遥控器配置地址; fetch 获取其 refs;上游选择分支关系。
  • origin/main 是本地获取的知识,而不是服务器分支本身。
  • 连接 main 未发布该功能或更改其工作页面。

术语表介绍

远程 — 远程控制;远程跟踪参考 — ???上游 — 上游;裸存储库 — ambiguity;获取 — 阿尔巴;交通 — 交通.

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 连接遥控器,然后选择 故意上游。
  2. 该功能本地存在; 它尚未发表。
  3. 仅禁用后台抓取 在此记录存储库中。
  4. 写之前先切换到main 运输单据。
  5. 保存完整文档,无需 计算机特定的路径或凭据。
  6. 暂存运输文件 在主要方面,而不是在功能方面。
  7. 该文档添加了 在 main 上第六次提交。
  8. 准备一个单独的裸副本 主要用于当地交通。
  9. 这个目的地主要有 但没有功能分支。
  10. 原始而空旷的目的地 是单独的存储库。
  11. 生成文件 URL 预期的当地目的地。
  12. 保存地址不取 分支或上传功能。
  13. 打开远程对话框 原始存储库。
  14. 将其命名为 origin 并验证 完整的目的地。
  15. 遥控器已配置;它的 尚未获取分支。
  16. 当获取规则存在时 跟踪参考查询为空。
  17. 选择缺失的上游 在不移动 main 的情况下失败。
  18. 是否选择上游 取代抓取?事实并非如此。
  19. 获取遥控器的主线,无需 切换当前分支。
  20. 起源斜线主要是你的 本地获取的记录。
  21. 抓取不是合并, 重新调整或替换页面。
  22. 选择关系 指定的当地主要分支机构。
  23. 单独选择该选项是 不是已确认的关系。
  24. 确认main的上游 而不移动其提交。
  25. 验证 main 及其上游, 匹配提示和清洁工作。
  26. 空的服务器功能查询不会 并不意味着本地功能丢失了。
  27. 地址、获取的记录和上游 设置仍然是不同的事情。
  28. 纠正上游选择 无需重置历史记录。
  29. 验证原件和服务器 在继续之前先分开。
  30. 解释为什么缺少参考 需要获取,而不是推送。
  31. 本地裸遥控器不是 托管项目或管道。
  32. 接下来,获取队友的更新 保持您自己的文件不变。