git fetch 把远端的更新下载到本地,只更新 origin/* 这类远程跟踪分支,不动工作区、不动当前分支。因此它是完全安全的,想什么时候看别人改了什么,随时可以执行。

本文列出 git fetch 的常用参数,并说明它与 git pull 的关系。

ℹ️
关于本系列
本文是《Git 使用教程》按命令拆分的第 24 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用 git fetch -h 看精简列表、git help fetch 看完整手册。示例以 Git 2.56.0 为准。

一、命令语法

先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。

bash语法
git fetch [<options>] [<repository> [<refspec>...]]

二、参数逐项详解

下表按用途列出 git fetch 的常用参数,每项都注明了「它到底改变了什么」。

参数作用
<remote> [<refspec>]指定远端与引用,如 git fetch origin main;不写按配置拉全部
--all拉取所有已配置的远端(有 upstream 时很有用)
-p / --prune顺手删除远端已不存在的远程跟踪分支
--tags / --no-tags显式取 / 不取标签
--unshallow把浅克隆补全为完整历史
--depth=<n> / --deepen=<n>把浅仓库加深到指定深度 / 再加深 n 条
--shallow-since=<日期> / --shallow-exclude=<ref>按时间或引用裁剪浅克隆范围
--dry-run只演练,打印将要拉取的内容
-f / --force强制更新不符合快进规则的引用,一般别用
-q / --quiet / -v / --verbose静默 / 详细输出
--multiple把多个参数都当作远端,一次性拉取
--recurse-submodules[=<模式>]按需一并拉取子模块的新提交
<refspec>形如 +refs/heads/*:refs/remotes/origin/*,高级自定义映射

fetch 与 pull 的关系

命令等价于
git fetch只更新远程跟踪分支,工作区完全不动
git pullgit fetch + git merge(或 --rebase)
git pull --ff-onlyfetch 后只允许快进,最安全的拉取方式

三、常用示例

看别人改了什么,但先不合

bash看别人改了什么,但先不合
git fetch --prune --all
git log --oneline HEAD..origin/main
git diff --stat HEAD..origin/main

浅克隆补全

bash浅克隆补全
git fetch --unshallow
# 或只加深一点
git fetch --deepen=50

脚本里的常用形式

bash脚本里的常用形式
git fetch --dry-run origin main
git fetch origin main:refs/remotes/origin/main

四、注意事项

先 fetch 再决定,是协作里最稳的节奏: git fetch --prune 之后用 git log HEAD..origin/main 和 git diff --stat HEAD..origin/main 看清楚差异,再决定 merge、rebase 还是先不动手,比直接 pull 可控得多。
ℹ️
配一次,长期省心
git config --global fetch.prune true 之后每次 fetch 自动清理失效引用;git config --global fetch.all true 可让无参数 fetch 拉取全部远端。

五、小结

git fetch 是唯一「随便跑、不会出事」的同步命令。把 --prune 配成默认,把 HEAD..origin/分支 变成看差异的肌肉记忆,就已经避开了大部分拉取冲突。

本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git pull 命令参数详解。