05. clone/fetch/pull/push 分不清?Git 远程协作实战
「Git」系列已发布: 00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命 | 01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂 | 03. add/commit/push 别再死记:Git 工作流核心概念实操 | 04. Git 分支管理:5 步彻底搞懂 branch 与 merge | 05. clone/fetch/pull/push 分不清?Git 远程协作实战(本文)
远程仓库的工作机制、四个命令的区别与适用场景、多人协作的同步策略——这篇把 Git 远程协作的那点事一次说透。
需要掌握 Git 基本工作流(第 03 篇)和分支操作(第 04 篇)。准备一个可访问的远程仓库——GitHub / GitLab / Gitee 都行,建个测试仓库跟着练效果最好。
一、远程仓库是什么
远程仓库就是托管在服务器上的项目版本库。本地仓库通过 push 把数据推上去,通过 fetch/pull 把数据拉下来。
Git 用简短的名称引用远程仓库。git clone时会自动把源仓库命名为origin,这是最通用的约定。
# 看有哪些远程仓库
git remote
# origin
# 看详细信息(含 URL)
git remote -v
# origin git@gitlab.com:team/project.git (fetch)
# origin git@gitlab.com:team/project.git (push)
1.1 管理远程仓库
1.1.1 增删改
# 添加
git remote add upstream <https://github.com/original/project.git>
# 改 URL
git remote set-url origin git@gitlab.com:new-team/project.git
# 重命名
git remote rename origin upstream-origin
# 删除
git remote remove upstream
1.1.2 多远程仓库:开源项目的经典配置
# 克隆自己的 fork
git clone git@github.com:my-account/project.git
cd project
# 添加上游
git remote add upstream <https://github.com/original/project.git>
# 确认
git remote -v
# origin git@github.com:my-account/project.git (fetch)
# origin git@github.com:my-account/project.git (push)
# upstream <https://github.com/original/project.git> (fetch)
# upstream <https://github.com/original/project.git> (push)
# 日常同步上游
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
1.2 获取远程数据
1.2.1 git fetch:安全的同步
# 从默认远程(origin)拿所有分支的最新数据
git fetch
# 从指定远程
git fetch upstream
# 一次性所有远程
git fetch --all
# 同时清理本地已不存在的远程分支引用
git fetch --prune
fetch的关键特性:只下载数据,不动本地工作目录。拉下来的更新存在origin/main、origin/feature-x等远程跟踪分支里,需要你手动合并或变基。
# 查看远程跟踪分支
git branch -r
# 对比本地和远程的差距
git log main..origin/main
# 把远程更新合进本地
git merge origin/main
# 或者
git rebase origin/main
1.2.2 git pull
fetch + merge/rebase
# git pull = git fetch + git merge(默认)
git pull origin main
# 用 rebase 代替 merge——推荐
git pull --rebase origin main
# 全局默认用 rebase
git config --global pull.rebase true
用
--rebase能避免生成不必要的合并提交,保持历史线性。建议设为全局默认。
1.3 推送到远程
1.3.1 git push 基础
# 推送当前分支到 origin
git push origin main
# 推送当前分支到远程同名分支(Git 2.0+ 默认)
git push
# 推送并设置上游跟踪——之后直接 git push 就行
git push -u origin feature-login
# 推送所有本地分支
git push --all origin
# 推送标签
git push origin v1.0.0
git push --tags # 所有本地标签
1.3.2 强制推送
# 强制推送——覆盖远程历史,危险
git push --force origin feature-login
# 更安全的版本——远程有新提交时拒绝
git push --force-with-lease origin feature-login
关于强制推送:
- 共享分支(main/develop)永远别 force push。
- 只在个人 feature 分支上,且确认没别人基于它工作时才用。
--force-with-lease始终优先于--force——它会检查远程在上次 fetch 后有没有新提交,有就拒绝,防止盖掉别人的工作。
1.4 远程分支管理
# 从远程分支创建本地跟踪分支
git checkout -b feature-login origin/feature-login
# 删除远程分支
git push origin --delete feature-deprecated
# 清理本地已失效的远程引用
git remote prune origin
# 看哪些远程分支已合并
git branch -r --merged main
1.5 SSH 与 HTTPS 认证
1.5.1 SSH 密钥配置
SSH 不用每次输密码,企业环境基本都用它。
# 生成 ED25519 密钥(推荐,安全且密钥短)
ssh-keygen -t ed25519 -C "your.email@example.com"
# 或者 RSA 4096 位(兼容旧系统)
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
# 启动 ssh-agent 并添加密钥
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# 复制公钥
cat ~/.ssh/id_ed25519.pub
把公钥贴到
GitLab / GitHub 的 SSH Keys 设置里。
1.6 多 SSH 密钥
同时维护个人和公司账户时的配置:
二、~/.ssh/config
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
Host gitlab.com-work
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_work
用对应的
Host 名称克隆:
git clone git@gitlab.com-work:company/project.git
git clone git@github.com-personal:myaccount/project.git
1.6.1 HTTPS 凭据缓存
某些环境只能用 HTTPS 时,配一下缓存省得老输密码:
# macOS(钥匙串)
git config --global credential.helper osxkeychain
# Linux 缓存 15 分钟
git config --global credential.helper cache
# Linux 缓存 1 小时
git config --global credential.helper 'cache --timeout=3600'
# 跨平台通用:Git Credential Manager
# (github.com/git-ecosystem/git-credential-manager
1.7 协作工作流:Fork + MR 模型
开源项目和大型团队最常用的协作方式,流程如下:
. Fork 原仓库到自己账号
1. 克隆自己的 Fork 到本地
1. 添加上游仓库为远程(upstream)
1. 创建功能分支开发
1. 发起 Pull Request / Merge Request
1. 等审查通过后合并
对应命令:
# 克隆自己的 Fork
git clone git@gitlab.com:my-account/project.git
cd project
# 添加上游
git remote add upstream git@gitlab.com:original/project.git
# 创建功能分支
git checkout -b feature-new-api
# 开发并提交
git add .
git commit -m "feat: 添加新的 REST API 接口"
# 推送
git push -u origin feature-new-api
# 在 GitLab/GitHub Web UI 上创建 Merge Request
# MR 合并后,同步上游
git checkout main
git pull upstream main
git push origin main
1.7.1 保持 Fork 同步
上游持续更新,定期同步:
# 拿上游更新
git fetch upstream
# 把自己 main 变基到上游最新
git checkout main
git rebase upstream/main
# 推到自己的 Fork
git push origin main
1.8 常见远程问题
1.8.1 推送被拒绝(non-fast-forward)
! [rejected] main -) main (non-fast-forward)
远程有你本地没有的提交
解决:
# 先拉再推
git pull --rebase origin main
# 解决冲突后重新推送
git push origin main
1.8.2 大文件推送超时
# 加大 HTTP 缓冲区
git config --global http.postBuffer 524288000 # 500MB
# 还超时的话换 SSH
git remote set-url origin git@gitlab.com:team/project.git
1.8.3 远程 URL 不可达
# 测试 SSH
ssh -T git@gitlab.com
# 测试 HTTPS
curl -I <https://gitlab.com>
# 检查当前 URL
git config --local remote.origin.url
1.9 文章引用
📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。
📎 微信原文:05. clone/fetch/pull/push 分不清?Git 远程协作实战
| 微信公众号【运维知识点滴】 | 微信小程序【A5单据合并&大试卷拆分转A4打印】 |
|---|---|
![]() |
![]() |
| 运维实战干货 · 关注追更 | Word 转 PDF · 试卷/发票打印神器 · 免费 |
💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:
- A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
- 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
- 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
- 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
- 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

