git merge --ff-only 是什么
加 --ff-only 之后,合并只允许快进:目标分支必须是当前分支的直接后继,否则命令直接失败退出,不会生成合并提交。它的价值在于把「历史是否分叉」变成一个显式的检查点,让意外合并无处藏身。
为什么常被当作校验手段
能快进说明当前分支没有独有提交、完全落后于目标;反过来,命令失败就说明本地已经分叉。发布前用它校验「本地主干是否落后于远端主干」,比人眼比对日志可靠。它也是 pull.ff 设为 only 之后 pull 的底层行为。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.x) |
|---|---|
| 语法 | git merge --ff-only <分支> |
| 行为 | 无法快进时直接失败,不产生合并提交 |
| 配置项 | pull.ff=only 让 pull 也只接受快进 |
| 典型用途 | 主干同步、发布前校验 |
| 失败提示 | Not possible to fast-forward |
典型使用场景
- 发布前校验:确认本地主干没有分叉提交
- 强制线性:团队要求主干只允许快进推进
- 安全同步:从远端同步主干时拒绝隐式合并
- 流水线检查:在 CI 里用它验证分支状态
- 配合变基:先整理再收尾,保证结果保持线性
常用示例
常用示例
git switch main
git fetch origin
git merge --ff-only origin/main # 只允许快进
git status -sb # 查看领先与落后数
git config --global pull.ff only # 让 pull 也只接受快进
git log --oneline --graph -8 # 核对历史是否保持线性结果与含义
| 结果 | 含义 | 下一步 |
|---|---|---|
| 快进更新 | 本地落后,指针直接前移 | 无需处理 |
| Already up to date | 本地与目标一致 | 无需处理 |
| 无法快进报错 | 本地存在独有提交,已分叉 | 先决定变基还是合并 |
| 提示 Not possible | 分叉需要人工选择集成方式 | 用 rebase 或 merge |
本地主干已经分叉(既有本地提交又有远端新提交)时,--ff-only 会报 Not possible to fast-forward,这时要先决定用变基还是合并。
把 pull.ff 设为 only 之后,习惯性的 git pull 在分叉时也会失败。这是刻意的保护,需要显式选择集成方式,而不是反复拉取同一条命令。
在需要严格线性的仓库里,可以把这个选项写成日常默认,同时把变基整理作为标准流程的一部分,让本地提交在推送前就保持线性。