Git 远程协作:remote / fetch / pull / push
更新时间:2026-08-25。本篇覆盖与远端同步的四条命令:
git remote(管理远端)、git fetch(只拉取)、git pull(拉取并合并)、git push(推送),以及"上游跟踪"这一核心概念。
本地与远端的关系
远端(remote)是另一个仓库(通常是服务器上的裸仓库)。本地通过"远程跟踪分支"(如 origin/main)记录"上次看到的远端状态"。

远程跟踪分支只是本地缓存:origin/main 是"远端 main 在上次同步时的样子",它不是你能直接提交的分支——要更新它只能通过 fetch/pull/push。
1. git remote:管理远端
bash
git remote -v # 查看所有远端及 URL(最常用)
git remote add origin <url> # 添加远端
git remote remove <name> # 移除远端
git remote rename <old> <new> # 重命名
git remote set-url origin <url> # 更换地址(换协议/搬家时)
git remote show origin # 查看远端详情(分支跟踪情况)
clone出来的仓库已自动配置好origin,手动init的仓库需git remote add origin <url>才能与远端交互。
2. git fetch:只拉取,不改本地
bash
git fetch # 拉取 origin 所有分支的新提交
git fetch origin main # 只拉取 main
git fetch --prune # 顺带清理远端已删除分支的本地引用fetch 只更新 origin/* 远程跟踪分支,不动工作区与当前分支。适合"先看看远端有什么,再决定怎么合并"。
bash
git fetch
git log --oneline main..origin/main # 远端领先我哪些提交
git diff main origin/main # 差异
git merge origin/main # 确认后手动合并3. git pull:拉取并合并(fetch + merge)
bash
git pull # 拉取并合并当前分支的上游
git pull --rebase # 拉取后用 rebase 重放本地提交(推荐,历史更线性)
git pull --ff-only # 只允许快进,否则报错(保险)pull 的两种策略对比:
| 策略 | 效果 | 适用 |
|---|---|---|
pull(merge) | 生成合并提交,历史有分叉 | 非主线分支、需要保留并线记录 |
pull --rebase | 本地提交重放到远端之上,历史线性 | 主线协作、追求整洁历史 |
推荐
git config --global pull.rebase true,让git pull默认走 rebase——见 配置篇。
4. git push:推送本地提交
bash
git push # 推当前分支到同名上游
git push -u origin main # 首次推送并建立上游跟踪(-u = --set-upstream)
git push origin <branch> # 推指定分支
git push --tags # 推送所有标签
git push origin --delete <branch> # 删除远端分支
git push --force-with-lease # 覆盖远端历史(带保护,见下)上游跟踪(upstream)
-u 建立"当前分支 ↔ 远端分支"的绑定关系,之后:
git pull/git push无需再写远端与分支名;git status会提示"你的分支领先/落后 origin/main 多少次"。
bash
git branch -vv # 查看所有分支的跟踪关系推送被拒怎么办
远端领先于你(别人先推了)时推送会被拒,标准解法:
bash
git pull --rebase # 1. 拉取并把本地提交重放到远端最新之上
# 解决可能的冲突
git push # 2. 重新推送什么时候需要 --force
| 场景 | 命令 | 说明 |
|---|---|---|
| 改写已推送历史(如修复被拒的 PR) | git push --force-with-lease | 推荐:若远端有别人新提交则拒绝,防止覆盖他人工作 |
| 明确知道要覆盖 | git push --force | 危险:无条件覆盖,禁用于共享分支 |
| 误删远端分支 | git push origin --delete 后的恢复 | 需用 reflog/他人分支找回 |
黄金规则:永远不要 force push 到共享分支(main/develop)。改写只应发生在你的私有特性分支上。
协作常见流程
bash
# 1. 开新分支
git switch -c feature/export
# 2. 提交若干
git add -A && git commit -m "feat: 导出功能"
# 3. 首次推送建立上游
git push -u origin feature/export
# 4. 期间远端 main 前进 → 合并最新
git switch main && git pull --rebase
git switch feature/export && git rebase main
# 5. 再次推送(可能需要 force-with-lease 若已 rebase 过)
git push
# 6. 合并进 main 后清理
git switch main && git pull
git branch -d feature/export易错点
- 忘了
-u:首次推送不带-u,后续git pull/git push会报"no upstream branch",补一次git push -u origin <branch>即可。 git pull在未提交改动上执行:rebase 模式会因工作区不干净而拒绝,先提交或git stash。--force用顺手:除非在私有分支且确知无误,否则一律用--force-with-lease。- fetch 之后以为本地已更新:
fetch不会改当前分支,务必再merge/rebase或直接用pull。
一句话总结:remote 管地址、fetch 只更新缓存、pull --rebase 线性同步、push -u 建立跟踪——远端协作的每一步都围绕"远程跟踪分支"这面镜子进行。