Git - 我们能恢复已删除的提交吗?

131

我很惊讶,在SO上找不到答案。

我们能在git中恢复/还原已删除的提交吗?

例如,这就是我所做的:

# Remove the last commit from my local branch
$ git reset --hard HEAD~1

# Force push the delete
$ git push --force

现在,是否有办法找回已删除的提交?Git内部记录(日志)删除吗?


1
你可以通过 git reflog 找到之前的 HEAD 提交记录,并再次检出它。 - Martin G
以防有人想知道:这里介绍的方法只适用于您曾经在本地机器上提交过该提交(无论是在本地存储库中提交还是获取更改)。如果您想恢复其他人已经推送并在 GitHub / GitLab 服务器上删除的提交,请查看 GitHub 的 API,那里将有 API 帮助从旧提交创建分支。 - Hoàng Long
3个回答

360

要回到那个提交,您可以使用reflog查找其引用。

参考日志或“reflogs”记录了本地存储库中分支和其他引用的提示何时更新。

运行此命令:

git reflog

扫描前几个条目,找到遗失的提交。跟踪该提交的标识符(您可以使用第1或第2列)。我们称此标识符为"ID"。

如果自执行reset --hard以来没有进行任何额外的操作,则可以执行以下操作:

git reset --hard ID
git push -f origin master

如果在重置之后进行了其他工作,您可以使用以下方法将其挑选到您的分支中:

git cherry-pick ID
git push origin master

7
谢谢您!我的生命被拯救了——我刚才患了轻微心脏病发作。我以为我只能删除而不是取消暂存物品,没有想到您帮我挽救了所有工作进度。 - Sandy Garrido
1
<3 让我的一天变得美好,谢谢。 - Kryštof Řeháček
2
你救了我,非常感谢!!! - gurkan
2
就像其他人一样,你拯救了我的一天。 - Meliodas
1
当我意外删除了错误的提交时,我感到心脏病发作。谢谢你,兄弟。 - deja
显示剩余2条评论

56

是的,您可以使用reflog找到您的提交记录:

git reflog
显示所有在您的仓库中创建的提交 - 然后您应该使用checkout命令检出已删除的提交。
git checkout <your commit-SHA>

或者通过挑选它来进行精选:

git cherry-pick <your commit-SHA>

1
从reflog中找到了我的提交,可以使用checkout 9849343(无论是哪个提交SHA)进行恢复。非常感谢。 - curiousBoy
1
git checkout <commit-SHA> 拯救了我的生命。非常感谢你! - saiid

9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接