恢复git push -f丢失的提交
如果有人本地仓库比较新,让他暂时不要更新,并 git push -f,然后你拉取并合并即可,同时吸取教训,将重要分支设置为保护,如果是在线修改或没人拉取最新代码,能否恢复取决于远端仓库是否执行gc,否则神仙也救不回来了。
以没有gc过为例,登录到远程git服务器,并找到仓库所在目录,以我使用的gitea为例,gitlab类似:
git clone /home/git/gitea-repositories/fengqi/exmaple.git rescue
cd rescue
# 查找丢失的提交,如果没有输出commit表示没救了
git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (31/31), done.
dangling commit 558aac381bc8acb161447686361928e2e2edc9bf
dangling blob 82f865770e1590763574a60d53286f2102f6b03b
dangling blob d912156bec00a9f00850ab2ec3a3baf1016c2141
dangling blob f02e11383e55a7f7ac33d8dc6554ce4901e55a64
# 查看内容
git show 558aac381bc8acb161447686361928e2e2edc9bf
git checkout branch_xxx
git rebase 558aac381bc8acb161447686361928e2e2edc9bf
# 这里可能提示和远端不一样导致push失败,可以fetch后rebase,也可以pull,看你喜好
git push branch_xxx
因为原始信息只在远端,如果你没有权限登录到git远程仓库,大概率也没救了。