远程仓库 Gitee
掌握 remote/push/pull/fetch 与 Gitee 建仓推送,理解拉取与抓取区别
- 来源
- 补充
- 更新
标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原
完成标准(本章)
- 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 120 秒
- ✏️ 已练习:小练习正确率 ≥ 60%
- 📝 已通过测验:分数 ≥ 60 分
- 🛠️ 已掌握还需完成实践任务
0.3.4 远程仓库 Gitee
本章来源:远程仓库与 origin、clone/push/pull/fetch 与推送报错处理来自《第一阶段讲义》1.2/1.5 节【来源】,经重新组织表述;平台宣传数据(用户数等)按勘误 err-7.2-11【更新】不写入课程;本地 bare 仓库实验、Gitee 建仓通用流程与全部练习为新编【补充】。平台适用性 universal。
① 学习目标
- 说出 remote 与 origin 的含义,完成
git remote add/git remote -v操作; - 说清 fetch 与 pull 的区别(fetch 只下载不合并,pull = fetch + merge);
- 独立完成 push,并在被拒绝时按"先 pull 再 push"的思路排查;
- 按通用流程在 Gitee 建仓并推送自己的代码(可选);
- 用本地 bare 仓库模拟远程,完成"两个用户"的双向同步(实践任务)。
② 前置知识
- 必需:0.3.3 分支与合并(理解 main 分支与 fast-forward 合并);
- 建议:0.3.1(四区模型)、0.3.2(init/add/commit 日常操作);
- 无需任何平台账号即可完成本章全部必做实验(实验只使用本地目录)。
③ 核心概念【来源】
| 概念 | 说明 |
|---|---|
| remote | 远程仓库地址在本地的登记名:git remote add origin <地址> 把地址绑定到 origin 这个名字;git remote -v 查看所有登记 |
| origin | 只是约定俗成的远程别名,不是 git 关键字;可以改名为 gitee、github 等 |
| clone | 把远程仓库完整复制到本地(含全部历史),并自动建立 origin 与分支跟踪关系 |
| push | 把本地新提交上传到远程;首次推送新分支用 git push -u origin main(-u 建立跟踪,之后可直接 git push) |
| fetch | 只把远程新提交下载到本地(更新 origin/main 指针),不合并工作区;安全,随时可做 |
| pull | = fetch + merge:下载并立即合并到当前分支;工作区有未提交改动或双方改同一处时可能冲突 |
| push 被拒绝 | 远程有本地没有的新提交(non-fast-forward)或认证失败;正确姿势:先 git pull 合并再 git push |
| Gitee 建仓通用流程 | 网页登录 → 新建仓库(名称、是否初始化 README)→ 复制仓库地址 → 本地 git remote add + git push;只讲流程,不锁具体界面 |
| 【更新】平台宣传数据 | 原资料 1.2 节引用 Gitee 用户量等宣传数据且未注明来源与时间;课程一律不写入此类数据,只讲功能用法(勘误 err-7.2-11) |
④ 通俗解释【补充】
把远程仓库想成异地总仓,三件事分清:
- push 是发货:把本地货架上的新货(提交)发到异地总仓;
- fetch 是到总仓抄清单:把对方货架的变化清单抄回来,不签收、不上架——你的店面(工作区)毫无变化;
- pull 是签收并上架:抄完清单直接提货,并进你自己的货架(合并到当前分支)。
所以"只想看看对方改了什么"用 fetch;"确定要合并"用 pull。而 origin 只是总仓在你通讯录里的名字——名字随便改,货还是那批货。
⑤ 示例代码
代码示例与验证记录
- examples/git-local-remote-commands.txt本地 bare 仓库模拟远程(push/pull/fetch 全流程实测)✓ 已实测(git 2.53.0.windows.2 / Windows 11, 2026-08-15)编译:
按文件内顺序在终端逐行执行(全部本地目录操作,不联网)适用环境:LinuxWindows(MinGW)macOS展开预期输出(实测)
Initialized empty Git repository in <你的目录>/remote.git/ [main (root-commit) dac87b3] init: 第一条提交 To ../remote.git * [new branch] main -> main Cloning into '<你的目录>/bob'... done. To ../remote.git dac87b3..ff035cc main -> main From ../remote dac87b3..ff035cc main -> origin/main Updating dac87b3..ff035cc Fast-forward notes.txt | 1 + 1 file changed, 1 insertion(+) ff035cc feat: Bob 的修改 dac87b3 init: 第一条提交
差异说明:哈希值(dac87b3/ff035cc)与目录路径每台机器不同;fetch 显示的 From ../remote 是 git 对相对路径的归一化显示;本输出为 git 2.53.0.windows.2 / Windows 11 本机实测(实验在系统临时目录进行,结束后已删除)
完整源码见 /code 代码示例页
- examples/gitee-push-steps.txtGitee 建仓与推送通用流程(网页 + 命令)✓ 文档核对(非执行)· Gitee 官方帮助文档核对, 2026-08-15编译:
按文件内顺序操作(网页操作 + 命令清单;本清单不实际执行)适用环境:完整源码见 /code 代码示例页
⑥ 编译与运行方法
本章为命令清单,无编译步骤:
- ex1(本地 bare 仓库模拟远程)为全部本地目录操作,在本机 git 2.53.0 实测通过(见示例卡实测输出);
- ex2(Gitee 建仓与推送)为网页 + 命令通用流程,按 Gitee 官方帮助文档核对,未实际执行——创建真实远程仓库会改动外部平台状态,违反"实验只用本地仓库"的纪律;真实操作见实践任务的可选部分。
⑦ 常见错误
| 症状 | 原因 | 解决 |
|---|---|---|
push 被拒绝:! [rejected] ... non-fast-forward | 远程有新提交,本地落后 | 先 git pull origin main 合并,再 git push |
| push 报认证失败(Authentication failed) | HTTPS 凭证错误,或 SSH 密钥未配对 | HTTPS 用"用户名 + 访问令牌";SSH 检查公钥是否已添加到平台 |
fatal: remote origin already exists | 重复执行了 remote add | git remote -v 先查看;修改地址用 git remote set-url origin <新地址> |
| fetch 之后工作区没有任何变化 | fetch 只更新 origin/main 指针,不合并 | 想看到改动就 git merge origin/main(或直接 git pull) |
| git pull 提示"未指定合并策略" | 新版 git 对 pull 行为的安全提示 | 按提示配置 pull.rebase 或 pull.ff;学习阶段用默认合并即可 |
| 【纠错】引用 Gitee 用户量等宣传数据 | 数据未注明来源与时间,无法核实 | 课程不写入平台宣传数据,只讲功能用法(err-7.2-11) |
⑧ 小练习
小练习
学习自测:提交后才显示答案与解析(前端判分,不作为正式考试)ex-0-3-4-1.执行 git fetch origin 之后,本地工作区的文件会?(单选)
◌ 未作答ex-0-3-4-2.git push 被拒绝并提示 non-fast-forward,正确处理是?(单选)
◌ 未作答ex-0-3-4-3.git remote add origin https://... 里的 origin 是什么?(单选)
◌ 未作答
⑨ 章节测验
章节测验
⑩ 实战任务
实践任务
本地 bare 仓库模拟远程双向同步(必做)+(可选)真实 Gitee 建仓推送
用 git init --bare 在本地建一个"远程仓库",模拟 Alice/Bob 两个用户完成 提交→推送→克隆→ 修改→推送→fetch→pull 的双向同步闭环;学有余力再按通用流程在真实 Gitee 上建仓并推送自己的练习代码。
输入与输出
无程序输入输出。交付物:① 本地 bare 仓库实验目录(两个克隆都能 git log 看到同一份 2 条 提交历史);②(可选)Gitee 个人仓库链接或 git remote -v 截图。
功能要求
- 在系统临时目录建立 bare 远程仓库 remote.git
- 模拟 Alice:init 新仓库 → 提交 1 条 → remote add origin → push -u origin main
- 模拟 Bob:clone → 修改文件 → 提交 → push
- Alice 侧:先 git fetch 观察,再 git pull 合并,确认双向同步
- (可选)真实 Gitee:网页新建仓库 → git remote add origin 你的仓库地址 → git push -u origin main
限制条件
- 实验只用本地目录,必做部分不创建任何真实远程仓库
- 可选部分只推送自己的练习代码,不推送任何他人代码或敏感信息
- 实验结束删除临时目录(除非想保留练习仓库)
验收步骤(自检清单 0/4)
验收标准
- 两个克隆 git log --oneline 输出完全一致且含 init 与 feat 两条提交(验收步骤 4)
- Alice fetch 之后 git status 干净(fetch 不合并,验收步骤 3)
- (可选)git remote -v 显示 Gitee 仓库地址且 push 成功
常见失败原因
- remote add 之后 push 报 origin 找不到(路径写错或相对路径基准目录错)
- push 前忘记 commit(nothing to commit 或 No refs in common)
- fetch 之后以为工作区会自动更新(fetch 只更新指针)
- 克隆的仓库没有配置 user.name/user.email 就 commit
可选扩展
- 在 Bob 仓库新建分支 feature-x 并 push,观察 git branch -r 的远程分支
- 故意在双方修改同一行制造冲突,练习解决冲突的 add + commit 流程
完成必要清单后才能计入"已完成实践"(学习状态自动推导,不提供一键完成)
⑪ 面试问题
面试问题
git fetch 与 git pull 有什么区别?分别适合什么场景?高频C/C++ · easy
要点:fetch 只把远程新提交下载到本地并更新远程跟踪指针,不修改工作区;pull = fetch + merge,下载后立即合并到当前分支。
fetch 是"只取不并":它把远程的新提交对象下载回来,更新 origin/main 等远程跟踪引用, 工作区与当前分支完全不动,因此任何时候执行都安全,适合"先看看别人改了什么再决定"。 pull 是 fetch 与 merge 的连招:下载后立即把远程改动合并进当前分支;若本地有未提交改动 或双方修改了同一位置,可能产生冲突,需要处理。工程上的常见纪律:morning pull 用 fetch 先观察、确认无误再 merge;或者直接用 pull 但保持工作区干净。git pull --rebase 是另一种 策略(变基代替合并),初学先掌握默认合并即可。
追问:- 追问:git pull 与 git pull origin main 的区别?(后者显式指定远程与分支)
- 追问:fetch 之后怎样查看远程新增了什么?(git log origin/main、git diff main origin/main)
评分要点:- fetch 只下载不合并
- pull = fetch + merge
- 各自适用场景
git push 被拒绝(! [rejected] ... non-fast-forward)时怎么排查处理?高频C/C++ · medium
要点:说明远程有本地没有的新提交。先 git pull(或 fetch + merge)把远程改动合并进来,解决可能的冲突后重新 git push。
排查分两类。第一类"non-fast-forward":远程分支上有本地缺失的提交(别人推过或网页上改过), 直接 push 会覆盖对方历史,git 拒绝执行。正确流程:git pull origin main 合并远程改动, 有冲突就解决冲突、git add 后 git commit,再 git push。禁止用 git push -f 强行覆盖—— 会抹掉队友的提交,除非个人分支且团队明确约定。第二类"认证失败":HTTPS 检查用户名与 访问令牌(不是登录密码),SSH 检查本机密钥与平台公钥是否配对(ssh -T 测试)。此外 确认 git remote -v 地址正确、当前分支有上游跟踪(git push -u origin main 建立)。
追问:- 追问:解决冲突后还需要重新 add 和 commit 吗?(需要,冲突解决产生一次合并提交)
- 追问:什么情况下 push -f 才是可接受的?(个人 feature 分支、团队明确约定、远程无人依赖)
评分要点:- 识别 non-fast-forward 含义
- 先 pull 再 push 的正确流程
- 认证失败排查点
- 强调 -f 的危险
项目为什么要使用远程仓库?git remote 与 origin 是什么?C/C++ · easy
要点:远程仓库承担异地备份、多人协作、代码评审与发布枢纽的角色;remote 是远程地址在本地配置里的登记名,origin 是默认别名。
远程仓库解决三个问题:① 异地备份——本地磁盘损坏仍可从远程完整恢复(分布式模型中 每个克隆都含全部历史);② 多人协作——每个人把本地提交 push 到同一远程、pull 对方的 改动,冲突显式化而不是互相覆盖文件;③ 评审与发布——基于远程做 pull request/代码评审、 打 tag 发布版本。git remote 命令管理这些远程的登记信息(git remote -v 查看), 每条登记是一个"名字 + 地址"对;origin 只是 git clone 或约定俗成使用的默认名字, 不是关键字,可以改名为 gitee、github 等。理解"名字只是别名"就不会被多个远程搞晕。
追问:- 追问:一个本地仓库可以同时有多个远程吗?(可以,如 git remote add upstream ...)
评分要点:- 备份/协作/评审三点
- remote 与 origin 的别名语义
⑫ 延伸阅读
- 《Pro Git》第 2 章"Git 基础"与第 3 章"分支"(官方免费书,只引名称不复制内容);
- Gitee 官方帮助文档(只引名称,不复制内容);
- 本地手册:
git help remote/git help fetch/git help pull; - 下一章预告:0.3.5 提交规范与 .gitignore——把提交历史写成别人看得懂的文档。
迁移训练(migration training)
把本章技能迁移到 Linux 与 Mac:
| 环节 | Windows | Linux | Mac |
|---|---|---|---|
| 命令 | 一致 | 一致 | 一致 |
| 差异 | 路径 \、换行符 CRLF、HTTPS 凭证走凭证管理器 | 路径 /、换行符 LF、常用 SSH 密钥(~/.ssh) | 同 Linux |
不变的:remote/push/pull/fetch 全部命令与行为、Gitee 网页操作;要改的:路径写法与凭证方式。 注意:本章必做实验的"远程仓库"是本地 bare 目录,与操作系统无关;真实 Gitee 的使用只在可选部分。
内容来源映射
| 内容部分 | 资料 | 位置 | 标记 | 说明 |
|---|---|---|---|---|
| 远程仓库与 origin 概念、clone/push/pull/fetch 区别、推送报错处理、Gitee 建仓推送流程 | 第一阶段讲义 | 1.2/1.5 节 | 【来源】 | 正文在原资料基础上重新组织表述,未大段复制原文 |
| Gitee 平台宣传数据(用户量等)不写入课程 | 第一阶段讲义 | 1.2 节 | 【更新】 | 第一步报告 7.2 第 11 条:原资料引用 Gitee 用户量等宣传数据且未注明来源与时间,需核实;课程只讲功能用法,见勘误 err-7.2-11 |
| 本地 bare 仓库双向同步实验、Gitee 建仓通用流程核对、通俗解释与全部练习 | 无 | 【补充】 | 实验只在系统临时目录进行,不创建真实远程仓库;Gitee 步骤按官方帮助文档核对(documentation_checked),不冒充实测 |
本章勘误与更新记录(【纠错】/【更新】)
err-7.2-11 · 过时更新 · 出处 1.2 节
原文:资料引用 Gitee 用户量等宣传数据
正确:课程不写入任何未注明来源与时间的平台宣传数据(用户数等);只讲功能用法
原因:第一步报告 7.2 第 11 条:宣传数据未注明来源与时间,需核实