如果我运行gitbranch-d XYZ,是否有方法恢复该分支?有没有办法像我没有运行delete branch命令一样返回?


当前回答

最热门的解决方案实际上比要求的要多:

git checkout <sha>
git checkout -b <branch>

or

git checkout -b <branch> <sha>

将您移动到新的分支,以及您可能忘记提交的所有最近更改。这可能不是你的意图,尤其是在失去分支后处于“恐慌模式”时。

一个更干净(更简单)的解决方案似乎是一行(在使用git-relog找到<sha>之后):

git branch <branch> <sha>

现在,当前分支和未提交的更改都不受影响。相反,只会创建一个新分支,直到<sha>。

如果这不是提示,它仍然有效,并且您得到了一个较短的分支,那么您可以使用新的<sha>和新的分支名称重试,直到正确为止。

最后,您可以将成功恢复的分支重命名为其名称或其他名称:

git branch -m <restored branch> <final branch>

不用说,成功的关键是找到正确的承诺<sha>,所以明智地命名你的承诺:)

其他回答

是的,您应该能够执行git reflog(无缩写),并在已删除分支的顶端找到提交的SHA1,然后只需git checkout[sha]。一旦您完成了提交,就可以使用gitcheckout-b[branchname]从那里重新创建分支。


感谢@Cascabel的这款浓缩/单内胆版本,以及@Snowscrash如何获得sha。

如果你刚刚删除了分支,你会在你的终端中看到类似这样的内容:deleted branch<your branch>(was<sha>)。然后在这一行中使用<sha>:

git checkout -b <your-branch> <sha>

添加到tfe答案:git源代码的contrib/区域(在git.git存储库中)中还有git-resurrect.sh脚本,这可能会对您有所帮助。

git restore<name>尝试查找分支提示的痕迹调用<name>,并尝试恢复它。当前,reflog是搜索签出消息,并使用-r合并消息。具有-m和-t,将扫描所有ref的历史记录,以便将<name>合并到other/将<other>合并到<name>中(分别)提交主题很慢,但可以让你重新提起别人的话题分支。

第一种类型

git reflog

在终端中。

之后,获取HEAD@{**number**}(例如HEAD@{12})。

现在输入:

git checkout -b 'branch_name' 'HEAD@{22}'

我使用以下命令来查找和检索已删除的分支。第一步来自gcb的描述。

$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\  -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline

现在根据提交注释查找gitcommit-id(git-SHA),并在下面的命令中使用它。使用之前找到的GIT-SHA签出一个名为new-branch的新分支:

$ git checkout -b NEW-BRANCH GIT-SHA

根据我的理解,如果要删除的分支可以由另一个分支访问,您可以使用

git branch -d [branch]

而且你的工作没有丢失。请记住,分支不是快照,而是指向快照的指针。所以当你删除一个分支时,你就删除了一个指针。

如果删除另一个分支无法访问的分支,您甚至不会丢失工作。当然,这不会像检查提交哈希那样简单,但你仍然可以做到。这就是为什么Git无法删除使用-d无法访问的分支的原因。相反,您必须使用

git branch -D [branch]

这是Scott Chacon关于Git的必看视频的一部分。查看第58:00分钟,当他谈到分支以及如何删除分支时。

GitHub的Scott Chacon介绍Git