跳到内容

第 0 卷 / 第 3 章 / 第 5 课

3.5 远程仓库、fetch、pull 与 push ​

前置知识:解决合并冲突

预计时间:15 分钟

练习环境:概念示例不联网,文末用本地裸仓库模拟远程

完成标志:能解释本地分支、远程跟踪引用和服务器分支的区别

目前所有时间线都留在一块磁盘上。要让另一份工作副本参与,先要分清三样东西:本地分支、保存在本地的远程跟踪引用,以及服务器上的分支。远程仓库本质上是另一个 Git 仓库;GitHub 和 GitLab 另外提供账号、权限、评审与持续集成。

添加远程和第一次推送 ​

到“无网络模拟远程”之前的代码都是命令示意,需要真实仓库地址与相应权限。不要在连续练习的仓库中执行这些占位命令;文末会直接为它添加本地远程。

bash
git remote add origin https://example.invalid/team/project.git
git remote -v
git push -u origin main

origin 是约定俗成的别名,不是关键字;-u 设置当前分支的上游。示例域名故意不可用。真实推送可能因认证、权限、分支保护、检查或服务端钩子被拒绝,必须读完整错误。

克隆常用:

bash
REPOSITORY_URL=https://example.invalid/team/project.git
git clone "$REPOSITORY_URL"

它通常创建 origin、远程跟踪引用并检出远程默认分支。origin/main 是本地记录,不会自动实时映射服务器;fetch、pull 或 push 后才更新。

先 fetch,再决定怎么整合 ​

bash
git fetch origin
git log --oneline --left-right main...origin/main
git diff main...origin/main
git merge --ff-only origin/main

fetch 只下载对象并更新远程跟踪引用,不会直接改当前工作区。--ff-only 在本地没有独立提交时快进,否则拒绝,便于先查看分叉原因。

git pull 等于 fetch 加上配置的整合动作。后半段可能是 merge、rebase,或仅允许快进,并非永远“fetch + merge”:

bash
git pull --ff-only
# 或在团队约定重放本地提交时:git pull --rebase

push 被拒绝 ​

非快进只是常见原因之一。排查顺序:

  1. 读远程返回的完整错误和仓库规则。
  2. git fetch origin 更新本地视图。
  3. 用提交图和 diff 判断双方变化。
  4. 按团队策略 merge 或 rebase。
  5. 测试后重新 push。

不要看到拒绝就 --force。确需重写个人远程分支时,先确认无人依赖,再用 --force-with-lease;它检查远程引用是否仍等于预期值。无参数形式依赖本地远程跟踪引用,IDE 后台 fetch 可能更新这个依据;需要严格保护时,应明确指定已审查的预期提交。详见 git-push 的 lease 说明。共享主线通常应由平台保护,禁止强制推送。

无网络模拟远程 ​

bash
cd "$workdir"
git init --bare -b main remote.git
git -C project remote add origin "$workdir/remote.git"
git -C project push -u origin main
git clone "$workdir/remote.git" colleague

裸仓库没有普通工作区,适合作为本地服务器端实验。下一页先讨论评审和合并策略,随后综合实验会在两份克隆之间完成一次协作。

→ 下一步:rebase、PR 与工作流

Built with VitePress | Software Systems Atlas