如何在git中恢复已删除的分支?

时间:2011-04-04 19:23:07

标签: git

我正在尝试使用git进行软件开发。我发现如果我在git中删除一个分支,我可能永远丢失我的代码。这让我感到惊讶。我认为作为版本控制系统,它应该能够让我做任何事情(甚至是愚蠢的),而不用担心伤害我的工作。

以下是我的所作所为:

  1. 初始化git存储库。
  2. 对存储库进行多项更改。
  3. 切换/结帐当前工作目录到第一次提交。
  4. 删除主分支。
  5. 然后我丢失了所有的作品,我无法相信我所看到的。这是真的吗?如果我在编码时喝醉了。我可能会丢失git中的代码。
  6. 问题是如何回滚删除分支的操作​​? 或者,我怎样才能获得git中的所有历史记录,甚至是日志中消失的东西?

1 个答案:

答案 0 :(得分:66)

首先要避免此问题,请在评论中提出Jefromi建议:

  

另一个提示:仅使用 git branch -d ,而不是git branch -D   如果您要删除可能导致您失去工作的内容,则会收到警告,然后您可以在使用-D之前花一点时间思考。   (或者,您可以从gitk删除,以便真正看到您要删除的内容。)

-d
  

删除分支。
  分支必须在其上游分支中完全合并,或者如果没有使用HEAD--track设置上游,则必须在--set-upstream中合并。


但是,如果您“丢失”了您的工作,请参阅many blogs about reflog之一(评论中的James Kyburz建议):

Git reflog to the rescue

回到列表 Git reflog救援   2010年9月9日 - 由Chris Sloan撰写| 0评论»

  

前几天,我正在使用我们当前的分支策略为Real Travel开发一个功能,因为我们每个版本都是一个单独的分支。
  不确定这是否是导致睡眠不足的原因,但是我在将其合并回主分支以进行发布之前意外删除了我的本地和远程分支副本
  经过一段时间的快速震惊和思绪贯穿我失去工作时间后,我平静下来,依靠我的Git知识。
  阅读完整的提交历史记录:

     

有两种方法可以在git中读取提交历史记录。第一种方式显示详细信息提交列表,而另一种显示引用当前HEAD的日志。

// log of detailed commits by users
$> git log

// reference log compared to the current HEAD
$> git reflog
  

使用reflog命令,我能够确切地找到删除分支的最后一个引用的位置。
  reflog的示例输出可能如下所示:

c7f3d98 HEAD@{0}: commit: Merged in some code
f5716c8 HEAD@{1}: pull : Fast-forward
d93c27b HEAD@{2}: commit: Added some items to project
...
  

现在reflog不会准确显示分支被删除的位置,但是如果你记得你最后一次提交到该分支并且有足够详细的消息,那么它应该很容易找到和恢复。

     

通过查看您想要新分支的HEAD,可以直接恢复您的分支。

$> git checkout -b my_new_branch HEAD@{5}
  

您也可以使用哈希来签出新分支。

$> git checkout -b my_new_branch d93c27b
  

很简单,现在我可以继续在删除之前实际合并分支。