【问题标题】:How do I get the deleted-branch back in Git?如何在 Git 中恢复已删除的分支?
【发布时间】:2011-07-29 10:25:36
【问题描述】:

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

以下步骤是我所做的:

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

问题是如何回滚删除分支的动作?

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

【问题讨论】:

  • 如果你提交它仍然存在,检查 git reflog
  • 我希望,即使你喝醉了,你也不会再删除你的master分支!
  • 另一个提示:只使用git branch -d,而不是git branch -D。如果您要删除可能会让您失去工作的内容,您会收到警告,然后您可以在使用-D 之前花点时间思考一下。 (或者,您可以从 gitk 中删除,这样您就可以真正看到要删除的内容。)
  • 这只是版本控制系统不是备份系统或journaling filesystem(反之亦然)的另一个示例。

标签: git


【解决方案1】:

为了避免这个问题,Jefromi cmets 中的建议:

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

-d

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


但是,如果您确实“丢失”了您的工作,请查看many blogs about reflog 之一(正如James Kyburz 在 cmets 中建议的那样):

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

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

【讨论】:

  • 如果您碰巧记得分支上的最后一次提交是什么,那就太好了,但我只是不小心删除了多个本地分支,而我 记住最后一次提交是什么,所以我一直在筛选 391 个悬空提交,试图找出哪个分支在哪个提交上:/ 如果你想知道我是如何删除多个分支的,请转git fetch --prune upstream +refs/heads/*:refs/heads/* 有点危险:/
  • 我实际上通过在git reflog 中搜索已删除分支的名称来相当轻松地解决了我的多个分支删除问题,我仍然拥有这些名称......所以“保持冷静和 GIT REFLOG! " ;)
  • 实际上,我有一个已删除的分支从未检出到我的工作副本中(它是使用git branch 创建的),因此它不会显示在默认的git reflog 中,并且做git reflog <branch> 会导致“致命:不明确的参数”,我猜是因为分支引用在创建后从未移动过。是否有一些简单的方法可以通过一些我不知道的方法来恢复这个分支,还是我必须搜索悬空/无法访问的提交?
  • @Cupcake 实际上不确定,但我认为@{-1} 修订版参考在这里不起作用(stackoverflow.com/a/18954079/6309),所以......这本身可能是一个好问题。
  • 节省了我的一周,谢谢!我虽然在与 Visual Studio 插件同步开发时丢失了它
猜你喜欢
  • 2013-05-23
  • 2015-09-09
  • 2010-09-08
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2015-11-06
相关资源
最近更新 更多