我如何在Git中恢复已删除的分支?
如何在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
实际上,我不确定在这里是否可以使用@{-1}修订引用(stackoverflow.com/a/18954079/6309),所以...这可能是一个很好的问题。
保存了我的一周,谢谢!我在使用Visual Studio插件与开发环境同步时以为丢失了它。