如果我运行gitbranch-d XYZ,是否有方法恢复该分支?有没有办法像我没有运行delete branch命令一样返回?
当前回答
对于未安装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.
我意识到这可能不是“最简单的解决方案”或“正确的”解决方案,但它是在有人发现它有用时提供的。
其他回答
除了tfe的答案之外,您可以使用上述过程进行恢复,除非它的提交没有被垃圾收集。Git分支只是指向提交树中特定提交的指针。但是,如果您删除了指针,并且该分支上的提交没有合并到其他现有分支中,那么git会将其视为悬空提交,并在垃圾收集期间删除它们,垃圾收集可能会定期自动运行。
如果您的分支没有合并到现有分支,并且它被垃圾收集,那么您将放弃所有提交,直到分支从现有分支分支出来。
如果您使用的是Git扩展
虽然很旧,但当您在google恢复已删除的分支时,此线程是列表的顶部。我使用的是git扩展而不是命令行,所以我不熟悉这些命令,但reflog命令给了我一个线索,所以我在这里发布了我的git扩展解决方案,供其他使用git扩展的人阅读。
转到工具栏上的视图下拉列表选择Show reflog references
您删除的分支现在应该可以查看和选择,只需单击它并将其签出即可。
我使用以下命令来查找和检索已删除的分支。第一步来自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
我在删除分支的计算机上执行此操作:
数字刷新
响应:
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
仅仅使用git-relog并没有为我返回sha。只有提交id(8个字符长,sha长得多)
所以我用git-relog--无缩写
然后执行上述操作:git checkout-b<branch><sha>
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- 在GitHub上有一个公共回购的私人分支?
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式