pull --ff-only 是什么
git pull --ff-only 要求拉取只允许快进:远端领先时直接快进到远端位置,本地与远端分叉时则直接失败并给出提示。它把「拉取不动历史结构」变成硬性约束,适合要求主干线性、不希望有人随手制造合并提交的团队。失败不是故障,而是提示你先决定用变基还是合并来整合本地提交。可以配置 pull.ff only 作为默认行为。
基本信息
| 用途 | 保证拉取不改动历史结构 |
|---|---|
| 语法 | git pull --ff-only |
| 持久化 | git config pull.ff only |
| 失败含义 | 本地与远端已分叉,需要显式选择整合方式 |
| 平台 | 任意 Git 客户端 |
典型使用场景
- 主干要求线性,杜绝误生成的合并提交
- 上线前同步生产分支,确认本地没有偏离
- 脚本与 CI 中拉取代码,避免交互式合并挂住任务
- 排查「拉取后多出一条合并提交」的成因
- 新人环境下统一拉取行为,减少历史风格差异
- 配合分支保护,让主干只以快进方式更新
常用示例
常用示例
git switch main
git pull --ff-only # 只允许快进
git config --global pull.ff only # 设为默认行为
# 分叉时的处理:先看状态再决定
git fetch origin
git status
git rebase origin/main # 或 git merge origin/main拉取时的三种结果
| 情形 | 结果 |
|---|---|
| 本地落后 | 直接快进,历史保持线性 |
| 本地与远端一致 | 无需更新,命令无副作用 |
| 本地与远端分叉 | 命令失败,等待你选择变基或合并 |
分叉时命令失败并不是故障,而是提示你先决定变基还是合并;脚本中使用要显式处理退出码。
它约束的是本地拉取行为,不能替代分支保护:主干仍需服务端规则阻止不合规的推送。
与之互补的还有 --ff-only 推送侧的收件端约束:本地管住拉取,服务端管住推送,两边同时生效才能真正保持主干线性。
分叉时的处置顺序
- git fetch 刷新远端引用,先用 git status 看清领先落后
- 本地提交还想要:git rebase origin/main 重放到远端之上
- 本地提交可丢弃:git reset --hard origin/main(确认无未保存内容)
- 处理完再拉取或直接推送,避免在分叉状态反复试错
只想确认是否落后而不改动本地状态时,先 git fetch 再看 git status,比直接拉取更可控,尤其在被拒绝或中断后发现本地状态不明时更适用。