恢复 git push -force 覆盖的提交记录
遇到一个问题,同事把远端的临时分支代码拉到本地后,对临时分支进行了git reset到了我改代码之前的一个commitid的位置,然后修改完后直接通过git push -f把远端的提交记录也给覆盖了。我那部分的代码就不翼而飞了。我想恢复我哪份提交记录及代码。下面是模拟的场景及操作。
我 85af4b685ce68c94e9ba992efd7cad490ee0d982 commitid 将我的代码提交到了临时分支。

同事,从远端把代码拉入本地后进行了reset,并重新提交了他的功能。

这样可以发现85af4b685ce68c94e9ba992efd7cad490ee0d982 这个提交记录没了,我的代码内容也没了。怎么和恢复呢?通过git reflog
git reflog
:::info
用于查看本地仓库中 HEAD 和分支引用的历史变动记录。它可以帮助你找回误删的提交、恢复丢失的分支,或者查看你最近对仓库做了哪些操作。
:::

拿到我提交功能的哪个commitid
git reset --hard <commitid>来对代码进行恢复我提交的功能
然后再通过拉取临时分支最新的代码到本地也就是同事修改的功能,如果有冲突则先解决,没有冲突哪就直接通过git push -force来把我的提交功能+同事的功能推到远程的临时分支。

这里的关键在于找到丢失的commitid
如果觉得在当前操作有风险的化可以先通过 git branch <new_branch> <commitid> 或者 git checkout -b <new_branch> <commitid>根据当时的commitid再创建一个临时分支以保存之前的代码。
注意
git reflog只是在本地仓库保存,换一台机器,或者从远程新拉取的都不会之前git refloggit reflog默认保留 90 天,但是如果你执行了git gc(垃圾回收),旧的reflog可能被清理。
