git pull 与 git fetch 有什么区别

git fetch 只把远程提交下载到本地(更新 origin/main 等跟踪引用),不动你的工作区;git pull = git fetch + git merge(或 rebase),会自动合并进当前分支。想先看远程改了什么再决定,就先用 fetch。

最佳实践
Git 分支协作与合并示意

一句话:git fetch 只下载不合并,git pull 会在 fetch 后按选项和配置执行 merge、rebase 或仅允许快进。 fetch 后你的代码纹丝不动,只是本地的 origin/main 引用更新了;pull 则会把远程新提交直接合并进你当前分支(或按配置 rebase)。

对比

git fetch git pull
下载远程提交 ✅ ✅
更新 origin/main 引用 ✅ ✅
改动当前分支/工作区 ❌ ✅(merge 或 rebase)
可能产生冲突 ❌ ✅
安全性 随时可跑 工作区脏时需谨慎

先 fetch 看清楚的套路

git fetch origin
git log HEAD..origin/main --oneline   # 远程多了哪些提交
git diff HEAD origin/main --stat      # 改了哪些文件
git merge origin/main                 # 看完再决定合不合

pull 的合并方式

git pull                # 默认 merge(可能产生合并提交)
git pull --rebase       # 变基:把你的提交挪到远程提交之后,历史更线性
git pull --ff-only      # 只允许快进,有分歧就报错(团队协作推荐)

全局设置:git config --global pull.rebase true 或 pull.ff only。

常见问题(FAQ)

Q:为什么有人推荐永远用 fetch+merge 分两步?

可控:先看清楚远程改了什么、冲突面多大,再决定合并策略。pull 一步到位,冲突来了会被动进入合并状态。新手养成 fetch 先行的习惯更稳。

Q:pull 时工作区有未提交改动会怎样?

如果合并要动的文件你有未提交改动,Git 会拒绝并提示先提交或 stash。改动不冲突时 pull 可以正常进行。

Q:fetch 会让本地分支前进吗?

不会。fetch 只移动 origin/xxx 这类远程跟踪引用。你的本地分支要前进,必须显式 merge/rebase(或 pull)。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台