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


当前回答

第一种类型

git reflog

在终端中。

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

现在输入:

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

其他回答

仅仅使用git-relog并没有为我返回sha。只有提交id(8个字符长,sha长得多)

所以我用git-relog--无缩写

然后执行上述操作:git checkout-b<branch><sha>

我在删除分支的计算机上执行此操作:

数字刷新

响应:

74b2383 (develope) HEAD@{1}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from develope to master
74b2383 (develope) HEAD@{3}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: reset: moving to HEAD
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: clone: from http://LOCALGITSERVER/myBigProject/Android.git

并且我使用以下命令检索分支:

git checkout-b newBranchName 74b2383

当提交在reflog中时

大多数时间无法访问的提交都在reflog中。因此,首先要尝试使用命令git reflog(它显示HEAD的reflog)查看reflog。

如果提交是一个特定且仍然存在的分支的一部分,那么使用命令git reflog名称可能会更简单。它也适用于远程设备,例如,如果您使用了强制推送(尽管应该使用gitpush-forcewithlease,这样可以防止错误,并且更容易恢复)。


当他们不在reflog中时

如果您的提交不在reflog中(可能它们被不写入reflog的第三方工具删除了),您可以先尝试使用此命令创建一个包含所有悬空提交的文件

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

然后读取缺失提交的SHA并将分支重置为它。

经常使用的用户可以使用

git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'

下面是一些示例,说明如何分析找到的提交

显示提交元数据(作者、创建日期和提交消息):

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

另请参见差异:

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

在找到的提交上创建分支:

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560

Windows GUI可以通过菜单Repository=>Git maintenance=>recover lost objects。。。

相关:轻松恢复以前暂存的已删除文件

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

由于这篇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键。