撤销Git本地分支删除

564

我刚才错误地删除了一些实验性更改的分支,使用了git branch -D 分支名称, 我该如何恢复这个分支呢?


32
很高兴知道我不是唯一一个这样做的笨蛋(并且忘记定期将副本推送到远程)。 - Ray
12个回答

1011

您可以使用git reflog来查找分支的最后提交的SHA1。从那个点开始,您可以使用以下命令重新创建分支:

git branch branchName <sha1>

编辑: 正如@seagullJS所说,branch -D命令会告诉您SHA1,因此如果您尚未关闭终端,则变得非常容易。例如,这将删除并立即恢复名为 master2 的分支:

user@MY-PC /C/MyRepo (master)
$ git branch -D master2
Deleted branch master2 (was 130d7ba).    <-- This is the SHA1 we need to restore it!

user@MY-PC /C/MyRepo (master)
$ git branch master2 130d7ba

106
Git会在分支被删除时告诉你SHA1是什么,因此如果你只是删除了它,它可能仍然存在于命令行中的前面几行。 - seagullJS
2
如果该分支在服务器上存在,您可以使用 git branch branchName origin/branchName - Florian Castellane
1
此外,我最终使用了 git cherry-pick <sha1> 命令将提交移动到分支。 - Akin Okegbile
对于那些在IntelliJ的图形界面上进行删除操作的用户,请前往Git工具(+9)> 控制台选项卡,然后搜索branch -D - Ricardo
救了我的命!非常感谢。 - John

112

如果你知道分支的最后一个SHA1,可以尝试:

git branch branchName <SHA1>

你可以使用git reflog查找SHA1,该方法在解决方案--defect link--中有描述。


74

如果您刚刚删除了分支,在终端中您将看到类似于以下内容:

Deleted branch branch_name(was e562d13)
  • e562d13是一个唯一的ID(也称为“SHA”或“哈希”),使用它可以恢复已删除的分支。

要恢复分支,请使用以下命令:

git checkout -b <branch_name> <sha>

例如:

git checkout -b branch_name e562d13 

57

请按照以下步骤操作:

1:输入:

git reflog show 

这将显示所有提交历史记录,您需要选择具有您想要恢复的最后提交的sha-1。

2:使用您选择的 Sha-1 ID 创建分支名称,例如:8c87714。

git branch your-branch-name 8c87714

7
非常感谢,这对我有用。 我两个月的工作都丢失了,而这个解决方案帮助我找回了那些文件。 - Amit
1
哈哈哈哈。这只是我10分钟的工作,我还以为自己会有麻烦。 - om471987

44

如果您还没有推送删除操作,您可以简单地执行以下操作:

$ git checkout deletedBranchName

这个答案让Git扩展不再关心“您正在尝试推送的分支似乎是此远程的新分支”。非常感谢。 - Omer Tuchfeld

10

首先:备份整个目录,包括.git目录。

其次:您可以使用git fsck --lost-found命令获取丢失提交的ID。

第三步:将提交变基或合并到丢失的提交上。

第四步:在使用git的-D或--force选项之前,请三思而后行 :)

您还可以阅读这篇有关如何从此类错误中恢复的良好讨论

编辑:顺便提一下,不要运行git gc(或允许它自己运行 - 即不要运行git fetch或任何类似的命令),否则您可能会永久丢失提交。


是的,这就是为什么我们使用Git的原因,以避免携带所有这些。您提交的每个操作仍然对您可用。 - mateor
这个很好用!我还能够在树形结构中可视化丢失的提交记录:git fsck --lost-found | awk '/commit/{print $3}' | xargs gitk & - Melebius

7
如果您使用Source Tree删除了一个分支,您可以通过进入View -> Show Command History轻松找到已删除分支的SHA1。
它应该具有以下格式:
Deleting branch ...
...
Deleted branch %NAME% (was %SHA1%)
...

然后就按照原来的答案操作即可。

git branch 分支名 <sha1>


7
如果你使用的是IntelliJ IDEA,在“事件日志”中你会看到类似这样的内容: enter image description here 你可以简单地恢复你的分支。

6

首先,不要惊慌。你来到了正确的地方。 继续加油,我们都会犯错!这就是我们学习的方式! 我祝愿你健康、幸福和成功!

哦,关于答案!我想你已经找到了!

如果还没有!这里是答案。

use git reflog
git checkout branch branch_name commitsha

更进一步解释,在第二个命令中,branch_name是你想要给你的分支起的名称。commitsha是你想要检出的SHA号码,你可以从git reflog命令中获取。

再次祝您编程愉快!


5

谢谢,这个方法可行。

git branch 新分支名 sha1

git checkout 新分支名

//可以在我的旧分支中看到我之前提交的文件。


2
这不是一个论坛,请给有用的答案点赞,而不是重新发布它们。 - Melebius

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