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


当前回答

如果您使用的是Git扩展

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

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

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

其他回答

谢谢大家。

我的问题是我删除了GitLab(远程)和GIT(本地)上的分支。

但不知怎么的,我得到了我的承诺,就像这样:

首先,我得到了最后一次提交(SHA)

git log --graph --decorate $(git rev-list -g --all)

我简单地签出了上一个SHA

git checkout <SHA>

然后我通过键入

git switch -c <branch-name> 

然后我拿回了我的承诺我又把树枝推了一遍

谢天谢地。

ps:不知为什么(SHA)是一个提交代码

如果您正在使用VSCode。。。并且你在删除分支之前的某个时间点将其与服务器同步。。。

注意,gitbranchdelete只删除本地副本,而不是服务器上的副本。首先,在Git面板(左侧工具栏上的Git图标)中,查看分支,看看分支是否仍在“origin/your_branch_name”下。如果是这样的话,只需选择它,您就可以取回代码(建议您立即在其他地方复制/粘贴/保存代码)。

如果没有看到“origin/your_branch_name”,请安装GitLens扩展。这允许您在服务器存储库中直观地四处查看,并找到同步到服务器的副本。如果您有多个存储库,请注意,为了使存储库显示在GitLens中,可能需要从所需的存储库中至少打开一个文件。然后:

打开GitLens面板扩展存储库您应该看到类别列表:分支/参与者/远程/Stashes等

您应该在“Branches”或“Remotes->Origins”下找到YourLostTreasure。希望您会看到一个具有所需名称的分支-如果展开它,您应该会看到在该分支中更改的文件。双击文件名以打开它们,然后立即备份该代码。

如果你没有立即看到你丢失的分支,四处看看,如果你发现了有希望的东西,立即打开它并获取代码。我不得不四处寻找,直到找到TheGoldenBranch,但即便如此,代码还是丢失了最后一次或两次保存(可能是因为我在尝试a-Branch-Merge-buncy-incidentaly-clicking-Branch-Delete之前未能同步到服务器)。我的搜索被不必要地拉长了,因为当我第一次找到分支时,我并不完全确定名称是否正确,所以一直在寻找,花了一些时间才重新找到第一个分支。(因此,将卡普姆(Carpum),然后继续寻找。)

第一种类型

git reflog

在终端中。

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

现在输入:

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

我从远程重新创建了一个分支,试图清除一些我不想要的提交,并准备选择我想要的正确提交。当然我把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脚本。