Git:显式指定SHA的--force-with-lease为何与隐式版本行为不同?
关于git push --force-with-lease的行为差异解析
你遇到的问题核心在于--force-with-lease参数的两种写法对应的校验基准不同:
当你执行
git push --force-with-lease=preflight/myname origin develop:preflight/myname时,这里的preflight/myname被Git识别为本地分支名。如果本地没有这个分支,或者该分支的上游分支不是origin/preflight/myname,Git会用错误的基准SHA去和远程分支校验,自然会提示更新被拒绝。哪怕你本地的refs/remotes/origin/preflight/myname记录的SHA是正确的,只要没指定完整的远程追踪分支路径,Git不会自动关联到它。而当你显式指定SHA值
--force-with-lease=preflight/myname:7528290003ef5b36f9f6446c91cb4a3ddb20c0c2时,相当于直接告诉Git:“远程的preflight/myname分支当前必须是这个SHA值才能强制推送”。这时候Git会直接拿这个SHA和远程仓库的对应分支做对比,只要匹配就允许推送,跳过了本地分支上游的关联校验,所以成功。
正确的写法应该是指定远程追踪分支的完整路径,这样Git会用本地记录的远程分支SHA做校验:
git push --force-with-lease=origin/preflight/myname origin develop:preflight/myname
这样就和你显式写SHA的行为一致了——Git会读取本地refs/remotes/origin/preflight/myname里的SHA值,去和远程分支做校验。
内容的提问来源于stack exchange,提问作者T. Baum
相关产品推荐
相关产品推荐

