如果我运行gitbranch-d XYZ,是否有方法恢复该分支?有没有办法像我没有运行delete branch命令一样返回?
当前回答
如果您已经将分支推送到远程服务器,那么尝试使用git checkout<branch>,git将尝试从本地计算机中的最后一个源镜像进行克隆。
其他回答
除了tfe的答案之外,您可以使用上述过程进行恢复,除非它的提交没有被垃圾收集。Git分支只是指向提交树中特定提交的指针。但是,如果您删除了指针,并且该分支上的提交没有合并到其他现有分支中,那么git会将其视为悬空提交,并在垃圾收集期间删除它们,垃圾收集可能会定期自动运行。
如果您的分支没有合并到现有分支,并且它被垃圾收集,那么您将放弃所有提交,直到分支从现有分支分支出来。
如果您正在使用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的GitHub用户:
如果你想从GitHub网站恢复它,你可以使用他们的API获取回购相关事件的列表:
第一
查找那些SHA(提交散列):卷曲-ihttps://api.github.com/repos/PublicUser/PublicRepo/events…或私人回购:curl-su YourUserNamehttps://api.github.com/repos/YourUserName/YourProject/events(将提示输入GitHub密码)(如果回购需要双因素授权,请参阅下面对该答案的评论。)
Next
转到GitHub并创建一个新的临时分支,该分支将被永久删除(最好是Chrome)。
•转到分支机构并删除该分支机构。
•在同一页面上,不重新加载,打开DevTools,Network面板。现在准备。。。
•单击恢复。你会注意到一条新的“线”。右键单击它并选择“复制为cURL”并将此文本保存在某个编辑器中。
•附加到复制的代码行末尾,这一行:-H“Cookie=”。
您现在应该得到以下内容:
curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed
最后一步
将“BranchSHA”替换为SHA哈希,并将BranchName替换为所需名称(顺便说一句,从web重命名分支是一个很好的方法)。如果你不是太慢,无论如何你都需要提出这个要求。例如,只需将粘贴复制到终端。
P.S.
我意识到这可能不是“最简单的解决方案”或“正确的”解决方案,但它是在有人发现它有用时提供的。
我使用以下命令来查找和检索已删除的分支。第一步来自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 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告诉我“没有这样的远程‘原点’”?
- 如何从远程分支中挑选?
- 如何查看一个分支中的哪些提交不在另一个分支中?
- 如何取消在github上的拉请求?
- HEAD和master的区别
- GIT克隆在windows中跨本地文件系统回购
- RPC失败;卷度传输已关闭,剩余未完成的读取数据
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 错误:您对以下文件的本地更改将被签出覆盖
- Git rebase—即使所有合并冲突都已解决,仍然会继续报错
- 在Git中,我如何知道我的当前版本是什么?
- 跟踪所有远程git分支作为本地分支
- 自定义SSH端口上的Git
- git如何显示不存在于.gitignore中的未跟踪文件
- Git错误:遇到7个文件应该是指针,但不是