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

9 浏览
0 Comments

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

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

以下是我所做的步骤:

  1. 初始化一个Git仓库。
  2. 提交几个更改到仓库。
  3. 切换/检出当前工作目录到第一个提交。
  4. 删除主分支。
  5. 然后我失去了所有的工作,我无法相信我所看到的。这是真的吗?如果我在编码时喝醉了,我可能会在Git中丢失代码。

问题是如何撤销删除分支的操作?

或者,如何在Git中获取所有的历史记录,甚至是在日志中消失的内容?

0
0 Comments

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

为了避免这个问题的发生,Jefromi在评论中建议只使用git branch -d,而不是git branch -D。如果你要删除可能会丢失工作的内容,会收到警告,然后你可以在使用-D之前再考虑一下。或者,你可以在gitk中删除分支,这样你就可以看到你要删除的内容。

-d

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

但是,如果你确实“丢失”了你的工作,请参考James Kyburz在评论中建议的一些博客关于reflog的内容:

Git reflog to the rescue:

前几天,我正在使用我们当前的分支策略为Real Travel开发一个功能,我们每次发布都是一个单独的分支。我不确定是否是因为熬夜导致的缺乏睡眠,但我在将其合并回主分支以进行发布之前,我意外地删除了我的本地和远程分支的副本。在经历了一阵恐慌和思绪纷飞,我冷静下来并依靠我的Git知识。阅读完整的提交历史:有两种方法可以阅读git中的提交历史。第一种方式显示了详细的提交列表,而另一种方式则根据当前HEAD显示了日志。

//显示用户的详细提交日志

$> git log

//与当前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

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

如果你记得你的分支上的最后一次提交是什么,这很棒,但是我不小心删除了多个本地分支,我不记得它们所有分支的最后一次提交是什么,所以我只能在391个悬空提交中查找,以找出哪个分支是在哪个提交上 :/如果你想知道我是如何删除多个分支的,结果发现git fetch --prune upstream +refs/heads/*:refs/heads/*有点危险:/ 我通过在git reflog中进行文本搜索已经相当容易地解决了我的多个分支删除问题,我仍然保留着这些分支...所以“保持冷静并使用git reflog!”;)

实际上,我有一个从未检出到我的工作副本中的已删除分支(它是使用git branch创建的),所以它不会出现在默认的git reflog中,而且执行git reflog 会导致“fatal: ambiguous argument”,我想这是因为分支引用在创建后从未移动过。是否有一种简单的方法通过我不知道的某种方法恢复这个分支,还是我将不得不搜索悬空/不可访问的提交?

实际上,我不确定在这里是否可以使用@{-1}修订引用(stackoverflow.com/a/18954079/6309),所以...这可能是一个很好的问题。

保存了我的一周,谢谢!我在使用Visual Studio插件与开发环境同步时以为丢失了它。

0