带租约强推是什么
改写历史后推送个人分支需要强推,而 --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 推送,既完成改写又不必担心覆盖别人。
本地远端跟踪引用过期时租约保护会失效,直接推送仍可能覆盖他人的提交;共享分支上任何形式的强推都建议先与协作者确认。