You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行git push --mirror时为何我的提交被强制更新?

问题分析与解决方案

为什么会出现这个强制更新的情况?

这是因为git push --mirror的核心特性就是完全同步本地仓库的所有状态到远程,会强制覆盖远程的任何变更。

当你在push --mirror运行的过程中,从开发机推了新提交88ceb916e到远程,此时远程的master分支确实短暂前进到了这个新哈希。但push --mirror是基于它启动时你的本地仓库状态(此时本地master还停留在旧哈希a436fdda3)来执行的,当它完成时,会强制将远程的所有分支(包括master)回退到本地对应的状态——也就是把远程master从88ceb916e硬回退到a436fdda3。

这就解释了后续的两个现象:

  1. 你再推新提交时提示Everything up-to-date,因为此时远程master已经被回退到旧哈希,和你本地之前的状态一致了。
  2. 执行git pull --rebase时,远程master的哈希从88ceb916e变回a436fdda3,Git会识别这是一次强制更新,所以会提示你本地的WIP状态被保存,远程分支被强制覆盖。

如何恢复被覆盖的提交?

别担心,你的提交88ceb916e并没有彻底丢失,Git的reflog会记录所有分支的历史操作:

  1. 先查看reflog找到你的提交:
git reflog

你应该能在列表里找到88ceb916e的记录。
2. 恢复这个提交:

  • 如果你想把它重新应用到当前master分支,可以用cherry-pick:
git cherry-pick 88ceb916e
  • 或者直接基于这个提交创建新分支,之后再合并回master:
git checkout -b recovered-feat 88ceb916e
git checkout master
git merge recovered-feat

如何避免再发生这种问题?

  • 禁止并行操作:执行git push --mirror的时候,绝对不要同时进行其他推送或者修改远程仓库的操作,因为--mirror是全量强制同步,会无视远程的任何最新变更。
  • 先拉再推:在执行push --mirror之前,先拉取远程的最新状态,确保本地仓库是完全同步的:
git fetch --all
git push --mirror
  • 锁定备份时段:如果push --mirror是用来做仓库备份的,建议在备份期间暂时锁定远程仓库(比如通过Git服务器的权限设置),禁止其他用户推送,避免干扰。

内容的提问来源于stack exchange,提问作者dawncold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:32