3.5 远程仓库、fetch、pull 与 push
前置知识:解决合并冲突
预计时间:15 分钟
练习环境:概念示例不联网,文末用本地裸仓库模拟远程
完成标志:能解释本地分支、远程跟踪引用和服务器分支的区别
目前所有时间线都留在一块磁盘上。要让另一份工作副本参与,先要分清三样东西:本地分支、保存在本地的远程跟踪引用,以及服务器上的分支。远程仓库本质上是另一个 Git 仓库;GitHub 和 GitLab 另外提供账号、权限、评审与持续集成。
添加远程和第一次推送
到“无网络模拟远程”之前的代码都是命令示意,需要真实仓库地址与相应权限。不要在连续练习的仓库中执行这些占位命令;文末会直接为它添加本地远程。
git remote add origin https://example.invalid/team/project.git
git remote -v
git push -u origin mainorigin 是约定俗成的别名,不是关键字;-u 设置当前分支的上游。示例域名故意不可用。真实推送可能因认证、权限、分支保护、检查或服务端钩子被拒绝,必须读完整错误。
克隆常用:
REPOSITORY_URL=https://example.invalid/team/project.git
git clone "$REPOSITORY_URL"它通常创建 origin、远程跟踪引用并检出远程默认分支。origin/main 是本地记录,不会自动实时映射服务器;fetch、pull 或 push 后才更新。
先 fetch,再决定怎么整合
git fetch origin
git log --oneline --left-right main...origin/main
git diff main...origin/main
git merge --ff-only origin/mainfetch 只下载对象并更新远程跟踪引用,不会直接改当前工作区。--ff-only 在本地没有独立提交时快进,否则拒绝,便于先查看分叉原因。
git pull 等于 fetch 加上配置的整合动作。后半段可能是 merge、rebase,或仅允许快进,并非永远“fetch + merge”:
git pull --ff-only
# 或在团队约定重放本地提交时:git pull --rebasepush 被拒绝
非快进只是常见原因之一。排查顺序:
- 读远程返回的完整错误和仓库规则。
git fetch origin更新本地视图。- 用提交图和 diff 判断双方变化。
- 按团队策略 merge 或 rebase。
- 测试后重新 push。
不要看到拒绝就 --force。确需重写个人远程分支时,先确认无人依赖,再用 --force-with-lease;它检查远程引用是否仍等于预期值。无参数形式依赖本地远程跟踪引用,IDE 后台 fetch 可能更新这个依据;需要严格保护时,应明确指定已审查的预期提交。详见 git-push 的 lease 说明。共享主线通常应由平台保护,禁止强制推送。
无网络模拟远程
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裸仓库没有普通工作区,适合作为本地服务器端实验。下一页先讨论评审和合并策略,随后综合实验会在两份克隆之间完成一次协作。