首页/开发/Git 与协作速查/变基后的安全强推
合并变基与冲突71 条

变基后的安全强推

变基改写了本地分支,推送需要 --force-with-lease:只有在远端仍是你上次看到的位置时才覆盖,降低覆盖他人提交的风险。

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

git push --force-with-lease 是什么

变基或 amend 之后,本地历史与远端已经分叉,普通推送会被拒绝,只能用强推覆盖。--force-with-lease 是强推的安全版本:它只在远端引用仍等于你最后一次看到的位置时才允许覆盖。如果别人在这期间推过提交,推送会被拒绝,从而避免悄悄覆盖别人的工作。

它和 --force 的差别

--force 无条件覆盖,不管远端在你操作期间发生了什么;--force-with-lease 多了一个附加条件:远端必须是「你所知道的那个版本」。这个条件依赖本地记录的远端位置,所以执行前要先 fetch,让这份记录保持准确。

基本信息

适用平台Linux / macOS / Windows(Git 1.8.5 起支持)
语法git push --force-with-lease origin <分支>
安全点远端引用被他人更新时推送直接失败
替代方案git push --force 无保护,不推荐
使用前提先 fetch,保持本地对远端的记录准确
报错含义提示 stale info 说明远端已有新提交

典型使用场景

  • 变基之后推送:本地历史被重写,需要覆盖远端
  • 修补提交之后推送:amend 生成新哈希,同样需要强推
  • 整理分支:合并或删除提交后同步到远端
  • 保护协作:希望覆盖前确认远端没有别人的新提交
  • 更严格场景:配合 --force-if-includes 进一步降低覆盖风险

常用示例

常用示例
git fetch origin                            # 先同步远端状态
git rebase origin/main                      # 变基改写本地历史
git push --force-with-lease origin feature  # 安全覆盖远端
git push --force-if-includes origin feature # 更严格(Git 2.30+)
git log --oneline origin/feature -3         # 核对远端与本地的位置

两种强推的差别

命令覆盖条件风险
--force无条件覆盖可能丢掉他人提交
--force-with-lease远端仍是你上次看到的位置比 --force 安全得多
未 fetch 时用租约依据本地旧记录判断仍可能覆盖他人提交
--force-if-includes要求本地确实包含远端最新提交更严格,需 Git 2.30+
--force-with-lease 依赖本地对远端的记录,必须先 fetch 再推。若提示 stale info,说明远端已有新提交,先核对再决定下一步。
受保护分支通常禁止强推,正确做法是走 PR 或 MR 合入流程。绕过保护规则只是把风险转嫁给团队。

易错点

  • 不 fetch 就直接强推,租约依据本地旧记录判断,仍可能覆盖他人提交
  • 受保护分支通常禁止强推,流程上应改为 PR/MR 合入,而不是对抗保护规则
  • 提示 stale info 时仍强行用 --force 覆盖,会真的丢掉远端的新提交
  • 在共享分支上强推会让协作者的历史分叉,需要他们手动对齐,代价常被低估

数据来源与参考

  • Git 官方文档:git-push(--force-with-lease)
  • Git 2.30 Release Notes(--force-if-includes)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌