执行git push --mirror时为何我的提交被强制更新?
问题分析与解决方案
为什么会出现这个强制更新的情况?
这是因为git push --mirror的核心特性就是完全同步本地仓库的所有状态到远程,会强制覆盖远程的任何变更。
当你在push --mirror运行的过程中,从开发机推了新提交88ceb916e到远程,此时远程的master分支确实短暂前进到了这个新哈希。但push --mirror是基于它启动时你的本地仓库状态(此时本地master还停留在旧哈希a436fdda3)来执行的,当它完成时,会强制将远程的所有分支(包括master)回退到本地对应的状态——也就是把远程master从88ceb916e硬回退到a436fdda3。
这就解释了后续的两个现象:
- 你再推新提交时提示
Everything up-to-date,因为此时远程master已经被回退到旧哈希,和你本地之前的状态一致了。 - 执行
git pull --rebase时,远程master的哈希从88ceb916e变回a436fdda3,Git会识别这是一次强制更新,所以会提示你本地的WIP状态被保存,远程分支被强制覆盖。
如何恢复被覆盖的提交?
别担心,你的提交88ceb916e并没有彻底丢失,Git的reflog会记录所有分支的历史操作:
- 先查看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
相关产品推荐
相关产品推荐

