git fetch 是什么
git fetch 从远端取回新的对象与引用更新,但不改动当前分支与工作区。远端跟踪引用(例如 origin/main)会被更新,你自己的工作区保持原样,之后可以慢慢决定合并还是变基。它是比 pull 更可控的同步方式。
为什么值得先 fetch
直接 pull 会在同一个动作里完成取回与集成,一旦结果不符合预期,就得在已经变化的历史里找原因。先 fetch 能把两件事拆开:取回之后用 git log HEAD..origin/main 看清上游到底多了什么,确认无误再决定集成方式。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.x) |
|---|---|
| 语法 | git fetch [远端] [分支] |
| 与 pull 区别 | 只更新远端跟踪引用,不动当前分支与工作区 |
| 常用参数 | --all;--prune;--dry-run;--tags |
| 结果落地 | 更新 origin/* 这类远端跟踪引用 |
| 是否联网 | 需要网络访问远端仓库 |
典型使用场景
- 评审上游:先取回,再用区间日志看远端比本地多了什么
- 替换 pull:把取回与集成分成两步,避免隐式合并
- 清理引用:用 --prune 去掉远端已删除分支的本地跟踪引用
- 流水线预取:CI 中先 fetch,再决定检出哪些提交
- 浅克隆加深:用 fetch --depth 或 --unshallow 补齐历史
常用示例
常用示例
git fetch origin # 取回 origin 的更新
git fetch --all --prune # 取回所有远端并清理失效引用
git fetch origin main # 只取指定的分支
git log --oneline HEAD..origin/main # 看远端比本地多了哪些提交
git diff HEAD origin/main --stat # 看两边差异的规模
git fetch --dry-run # 演练,不真正取回fetch 与集成动作的差别
| 动作 | 当前分支 | 工作区 |
|---|---|---|
| git fetch | 不变 | 不变 |
| git merge origin/main | 前进或产生分叉 | 被更新 |
| git rebase origin/main | 本地提交被重写 | 被更新 |
| git pull | 取决于配置 | 被更新 |
fetch 之后当前分支不会自动变化,必须再执行 merge 或 rebase,变化才会真正落到你的分支上。
评审上游进展的常见姿势:先 fetch,再用区间日志 HEAD..origin/main 看远端多了哪些提交,确认之后再决定集成方式。
取回之后想进一步确认差异,可以用 git diff HEAD origin/main --stat 看规模,用 git branch -vv 看每条本地分支的领先与落后数,再决定对哪条分支做什么。