首页/开发/Git 与协作速查/git push --force-with-lease 带租约强推
Git 基础与命令88 条

git push --force-with-lease 带租约强推

有条件强推:当远端引用仍是你预期的位置时才允许覆盖,比 --force 多一层防误覆盖保护,适合 rebase 后推个人分支。

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

带租约强推是什么

改写历史后推送个人分支需要强推,而 --force 会无条件覆盖远端,万一别人已经往同一分支推了新提交,就会被无声抹掉。--force-with-lease 是带条件的强推:只有当远端引用仍停在你预期的位置时才允许覆盖,一旦远端被他人推进过就拒绝推送,从源头避免误删他人工作。它是 rebase 后推个人分支的推荐做法。

基本信息

对比--force 无条件覆盖 / --force-with-lease 有则拒绝
前提本地记录的远端跟踪引用要足够新
用法git push --force-with-lease origin <分支>
细化--force-with-lease=<分支>:<期望哈希> 显式指定
平台任意 Git 客户端与托管平台

典型使用场景

  • 个人功能分支变基后重新推送
  • amend 了已推送的提交,需要覆盖远端
  • 整理提交历史(折叠、拆分)完成后推送
  • 多人协作的分支上,用租约兜住误覆盖风险
  • 脚本里执行强推时降低对他人提交的破坏概率
  • 排查推送被拒时,判断是租约保护还是权限问题
  • 把误提交的大文件从历史中剔掉后重新推送

常用示例

常用示例
git fetch                          # 先更新远端跟踪状态
git push --force-with-lease origin feature/x
git push --force-with-lease=feature/x:abc1234 origin feature/x  # 指定期望位置
git log --oneline -3               # 推送前确认本地历史形态

三种强推方式对比

方式行为
--force无条件覆盖远端引用
--force-with-lease远端与预期不符则拒绝
--force-if-includes再要求本地确实包含远端最新提交
个人功能分支 rebase 后的常规姿势:先 fetch 刷新远端跟踪引用,再用 --force-with-lease 推送,既完成改写又不必担心覆盖别人。
本地远端跟踪引用过期时租约保护会失效,直接推送仍可能覆盖他人的提交;共享分支上任何形式的强推都建议先与协作者确认。

易错点

  • 推送前不 fetch,本地记录的远端位置是旧的,租约形同虚设,仍会覆盖别人的新提交
  • 共享分支不建议任何形式的强推,先确权再操作,否则会打断他人的工作基线
  • 把 --force 和 --force-with-lease 混用在脚本里,前者会绕过保护,审查脚本时容易漏看
  • 反复改写同一分支的提交,协作者本地历史会持续失配,应约定分支改写窗口并在完成后通知
  • 强推前不核对 git remote -v 的地址,租约用在了错误的远端同样会造成覆盖
  • 被拒绝时误以为是网络或权限问题而改用 --force,恰好绕过了唯一的保护,先读提示信息再决定

数据来源与参考

  • Git 官方文档:git-push(--force-with-lease)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌