git undo本地分支删除


375

我只是删除了错误的分支,并进行了一些需要的实验更改git branch -D branchName

如何恢复分支?


7
很高兴知道我不是这样做的唯一la脚(并且忘记定期推送副本)
Ray

Answers:


717

您可以使用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

71
Git告诉您删除分支时的SHA1,因此,如果您仅删除它,则可能只是命令行中的几行。
seagullJS

如果服务器上存在此分支,则可以使用git branch branchName origin/branchName
Florian Castellane

此外,我最终使用git cherry-pick <sha1>将提交移至分支
Akin Okegbile,

54

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

git branch branchName <SHA1>

您可以使用SHA1 git reflog,在溶液中描述这里


34

如果您尚未推送删除,则只需执行以下操作:

$ git checkout deletedBranchName

这个答案使Git Extensions对“您要推送的分支似乎是此远程服务器的新分支”闭嘴。非常感谢。
2014年

28

如果您只是删除了分支,那么您将在终端中看到以下内容:

Deleted branch branch_name(was e562d13)
  • 其中e562d13是唯一ID(又称“ SHA”或“哈希”),使用它可以还原已删除的分支。

要还原分支,请使用:

git checkout -b <branch_name> <sha>

例如

git checkout -b branch_name e562d13 

4

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

第二:您可以git fsck --lost-found用来获取丢失的提交的ID。

第三:重新定位或合并到丢失的提交上。

第四:在将-D或--force与git一起使用之前,请三思

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

编辑:顺便说一句,不要运行git gc(或允许它自己运行-即不要运行git fetch或类似的东西),否则您可能永远失去提交。


1
1和4是过大的IMO。
jwg

是的,这就是为什么我们使用git来避免携带所有这些东西的原因。您已执行的每个操作仍然可用。
家长

4

谢谢,这工作。

git分支new_branch_name sha1

git checkout new_branch_name

//可以在我的旧分支中看到我的旧签入文件


3

按着这些次序:

1:输入:

git reflog show 

这将显示所有提交历史记录,您需要选择具有要返回的最后一个提交的sha-1

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

git branch your-branch-name 8c87714

0

这为我工作:

git fsck --full --no-reflogs --unreachable --lost-found
git show d6e883ff45be514397dcb641c5a914f40b938c86
git branch helpme 15e521b0f716269718bb4e4edc81442a6c11c139
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.