Git 中文手册

git pull 和 git fetch 到底有什么区别?新手别再混

2026-09-06 约 3 分钟阅读

git pull 和 git fetch 都从远程拿代码,但一个会自动合并、一个只是下载。本文讲清两者区别、为什么推荐先 fetch、以及 pull --rebase 的正确用法。

场景:想从远程更新代码,到底用 git pull 还是 git fetch?很多人凭习惯敲,但两者的区别直接影响你是否会踩到「莫名冲突」的坑。

一句话理解

git fetch  = 把远程的新提交「下载」到本地(只下载,不合并)
git pull   = fetch + 自动 merge(下载后立即合并到当前分支)

pull 是 fetch 和 merge 的组合。所以理解 fetch 是基础,pull 只是它的便捷封装。

区别对照表

git fetchgit pull
下载远程提交
更新本地分支❌ 只更新 origin/xxx✅ 合并进当前分支
可能产生冲突不会
产生 merge 提交不会可能
推荐场景想看远程有无更新确认后快速同步

fetch 的典型用法(推荐习惯)

git fetch origin          # 下载远程最新,但不动你当前代码

# 查看远程领先了你多少
git log HEAD..origin/main --oneline

# 确认没冲突后,再手动合并
git merge origin/main

这样把「下载」和「合并」分成两步,你能先看清差异再决定,避免 pull 自动合并带来的意外。

pull 的便捷用法

git pull origin main          # 拉取并默认 merge
git pull --rebase origin main # 拉取并用 rebase 合并(历史更干净)

团队协作时,很多人用 git pull --rebase 代替默认 pull,因为它不产生多余的 merge 提交、历史是一条直线,冲突也更可控。

完整实战

# 同事推了新代码到远程
git fetch origin              # 1. 先下载,观察
git log HEAD..origin/main     # 2. 看到远程有 2 个新提交
git status                    # 3. 本地也有未推送提交

# 4. 用 rebase 把自己的提交叠到远程之上
git pull --rebase origin main

常见问题

  • fetch 后本地代码没变,是不是没拉到:不是,fetch 只下载。执行 git merge origin/maingit pull 才会应用。
  • pull 报 non-fast-forward:本地有远程没有的提交,先 pull --rebase 或手动处理冲突。
  • 只想看某个分支更新git fetch origin 分支名 只拉那个分支。

一句话速记

fetch 只「下载」,pull = fetch + 「合并」;想掌控合并过程用 fetch,图省事用 pull。

?

常见问题 FAQ

git fetch 之后本地代码会变吗?
不会。fetch 只把远程的提交下载到本地(更新远程追踪分支 origin/main),你当前工作区的代码和分支不会被改动。需要再 merge 或 rebase 才会应用。
为什么有人推荐少用 pull 多用 fetch+merge?
因为 pull 自动执行合并,有时会产生意外的 merge 提交或冲突,让你不清楚发生了什么。先 fetch 再手动 merge 或 rebase,你能完全掌控合并过程、看清差异。
git pull --rebase 和 git pull 有什么区别?
pull 默认用 merge 合并远程改动(可能产生 merge 提交);pull --rebase 则把你本地的提交变基到远程最新之上,历史更线性干净,是多人协作推荐用法。
fetch 完怎么查看远程有没有新东西?
git fetch 后可用 git log HEAD..origin/main 查看远程领先的提交,或用 git diff origin/main 对比差异,确认后再合并。