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