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


当前回答

我使用以下命令来查找和检索已删除的分支。第一步来自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

其他回答

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

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

除了tfe的答案之外,您可以使用上述过程进行恢复,除非它的提交没有被垃圾收集。Git分支只是指向提交树中特定提交的指针。但是,如果您删除了指针,并且该分支上的提交没有合并到其他现有分支中,那么git会将其视为悬空提交,并在垃圾收集期间删除它们,垃圾收集可能会定期自动运行。

如果您的分支没有合并到现有分支,并且它被垃圾收集,那么您将放弃所有提交,直到分支从现有分支分支出来。

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

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

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

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

在.git/objects目录内运行:

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

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

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

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

数字刷新

响应:

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