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 · 试卷/发票打印神器 · 免费
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费

💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:

  • A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
  • 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
  • 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
  • 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
  • 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

上一篇:04. Git 分支管理:5 步彻底搞懂 branch 与 merge