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


当前回答

恢复已删除分支的一般问题的一个非常常见的子问题是在合并后恢复功能分支,然后删除它,这是常见的做法。

由于这篇SO文章涵盖了,如果已成功合并,您始终可以恢复已删除的分支。这是因为分支只是一个指向提交的花哨指针,因为您已经合并,所以提交仍然存在。合并提交将列出合并的两个(或多个)分支的头部提交的哈希值。例如:

        git show master
        commit 849675951d41497e7b07d34096ebf36dc713221 (HEAD -> master)
        Merge: fc1c9ce 97f8a60
        Author: Me
        Date:   Sun Jan 9 16:14:24 2022 +0100

            Merge branch 'feature'

因此,您可以通过执行git checkout-b feature97f8a60来恢复delete“feature”分支,无需任何reflog内容。

其他回答

我从远程重新创建了一个分支,试图清除一些我不想要的提交,并准备选择我想要的正确提交。当然我把SHA写错了。。。

以下是我发现它们的方式(主要是从这里的答案中获得更简单的界面/交互):

首先,在日志中生成一个松散提交列表。尽快执行此操作并停止工作,因为垃圾收集器可能会丢弃这些垃圾。

git fsck --full --no-reflogs --unreachable --lost-found > lost

这将创建一个丢失的文件,其中包含您必须查看的所有提交。为了简化我们的生活,让我们只从中删除SHA:

cat lost | cut -d\  -f3 > commits

现在,您有了一个提交文件,其中包含您必须查看的所有提交。

假设您正在使用Bash,最后一步:

for c in `cat commits`; do  git show $c; read; done

这将向您显示它们各自的差异和提交信息。等待您按Enter键。现在写下所有你想要的,然后把它们摘下来。完成后,只需按Ctrl-C键。

如果您没有reflog,例如,因为您正在一个未启用reflog的裸存储库中工作,并且您要恢复的提交是最近创建的,另一个选项是查找最近创建的提交对象并查看它们。

在.git/objects目录内运行:

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit

这将查找在过去12小时内创建的所有对象(提交、文件、标记等),并对其进行筛选以仅显示提交。检查这些是一个快速的过程。

不过,我会先尝试Jakub的回答中提到的git-request.sh脚本。

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

git branch -d [branch]

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

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

git branch -D [branch]

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

GitHub的Scott Chacon介绍Git

如果您使用的是Git扩展

虽然很旧,但当您在google恢复已删除的分支时,此线程是列表的顶部。我使用的是git扩展而不是命令行,所以我不熟悉这些命令,但reflog命令给了我一个线索,所以我在这里发布了我的git扩展解决方案,供其他使用git扩展的人阅读。

转到工具栏上的视图下拉列表选择Show reflog references

您删除的分支现在应该可以查看和选择,只需单击它并将其签出即可。

首先转到git批处理项目,如:

cd android studio project
cd Myproject
then type :
git reflog

你们都有一个更改列表,参考号取参考号,然后从android studio或git betcha结账。另一个解决方案是获取参考号,然后转到android工作室,单击git分支,然后单击签出标签或参考号之后的修订,然后lol您就有了分支。