GitLab远程禁止force push时该如何操作?丢失的未提交文件能否恢复?
Git问题解决方案
1. force push被拒时的正确处理流程
当时的正确操作步骤如下:
- 首先备份当前所有未提交的工作区内容,执行命令:
git stash push -u,该命令会暂存包括未跟踪文件在内的所有工作区改动,避免内容丢失。 - 执行软重置撤销本地amend生成的commit,执行命令:
git reset HEAD~1 --mixed,--mixed是默认参数,仅会将commit包含的改动退回工作区,不会修改或删除现有工作区内容,完全规避文件丢失风险。 - 此时你修改的笔误内容和原本要提交的3个文件改动都处于工作区,重新暂存这3个文件,生成新的普通commit后直接执行
git push即可,不需要用到force push,完全符合保护分支的推送规则。 - 推送完成后执行
git stash pop,即可恢复之前暂存的3个暂不提交的核心工作内容。
如果确实需要保留amend后的commit历史,作为仓库维护者可以临时在GitLab项目的「设置-仓库-受保护分支」配置项中,放开对应分支你的账号的force push权限,推送完成后再关闭权限即可,该方案适合完全确认不会影响其他协作者的场景。
2. 丢失改动的恢复方案
已提交过的amend内容恢复
Git默认会保留所有曾经存在的commit记录至少2周(默认垃圾回收周期),执行以下操作即可恢复:
- 执行
git reflog查看HEAD指针的历史移动记录,找到你amend生成的commit对应的哈希值(取前7位即可) - 执行
git cherry-pick <对应commit哈希>即可直接恢复该commit,或者执行git reset <对应commit哈希> --mixed将该commit的改动退回工作区自行处理。
未暂存的核心工作文件恢复
这部分文件分两种情况恢复:
- 如果这些文件之前曾经执行过
git add操作,Git会存储对应的文件快照:执行git fsck --lost-found,命令执行完成后,进入项目目录下的.git/lost-found/other路径,所有未被引用的文件快照都存储在此,逐个打开文件核对内容后,即可提取你需要的代码内容。 - 如果你使用IDEA、VS Code等带本地历史记录功能的IDE,可以直接在IDE的本地历史功能中查找对应文件的修改记录,该方式恢复的文件保留原有文件名和完整修改轨迹,操作门槛更低。
内容的提问来源于stack exchange,提问作者dylanjm
相关产品推荐
相关产品推荐

