首页/开发/Git 与协作速查/git merge --ff-only 只允许快进
合并变基与冲突71 条

git merge --ff-only 只允许快进

当无法快进时直接失败退出,用于保持线性历史或校验「本地分支确实落后于远端」:能快进说明本地没有分叉提交。

Git 与协作速查开发更新于 2026-10-13

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 在分叉时也会失败。这是刻意的保护,需要显式选择集成方式,而不是反复拉取同一条命令。
在需要严格线性的仓库里,可以把这个选项写成日常默认,同时把变基整理作为标准流程的一部分,让本地提交在推送前就保持线性。

易错点

  • 把 pull.ff 设为 only 后,习惯性 git pull 在分叉时会失败,需要显式选择合并或变基
  • 本地存在未推送提交时不要用 --ff-only 硬凑,先确认这些提交是否需要保留或整理
  • 把该命令当成「强制同步」来用,实际它只会前移指针,不会丢弃任何提交
  • 在已分叉的分支上反复尝试只是重复报错,真正要做的是确定集成策略

数据来源与参考

  • Git 官方文档:git-merge(--ff-only)
  • Git 官方文档:git-config(pull.ff)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌