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 pull | git fetch + git merge(或 --rebase) |
git pull --ff-only | fetch 后只允许快进,最安全的拉取方式 |
三、常用示例
看别人改了什么,但先不合
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 命令参数详解。