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 合入流程。绕过保护规则只是把风险转嫁给团队。