pro*_*eek 1007 git branch git-branch
如果我跑git branch -d XYZ,有没有办法恢复分支?有没有办法回去,好像我没有运行删除分支命令?
tfe*_*tfe 1830
是的,您应该可以git reflog在已删除分支的末尾执行并找到提交的SHA1,然后只需git checkout [sha].一旦你进行了提交,你就可以git checkout -b [branchname]从那里重新创建分支.
感谢@Cascabel这个浓缩/单线版本.
您可以一步完成:
git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)
Phi*_*ppe 148
大部分时间无法访问的提交都在reflog中.因此,首先要尝试的是使用命令查看refloggit reflog(显示reflog HEAD).
如果提交是仍然存在的特定分支的一部分,则可能更容易使用该命令git reflog name-of-my-branch.它也适用于遥控器,例如,如果您强制推动.
如果您的提交不在您的reflog中(可能是因为没有在reflog中写入的第三方工具删除),我通过将我的分支重置为使用类似命令找到的提交的sha成功恢复了一个分支(它创建一个包含所有悬空提交的文件):
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
Run Code Online (Sandbox Code Playgroud)
如果你应该多次使用它(或者想在某处保存它),你也可以使用该命令创建一个别名......
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'
Run Code Online (Sandbox Code Playgroud)
并使用它 git push --force-with-lease
要调查已发现的提交,您可以使用一些命令来显示每个提交以查看它们.
要显示提交元数据(作者,创建日期和提交消息):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Run Code Online (Sandbox Code Playgroud)
要查看差异:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Run Code Online (Sandbox Code Playgroud)
找到提交后,在此提交上创建一个分支:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
Run Code Online (Sandbox Code Playgroud)
nob*_*bar 45
如果您想使用GUI,可以使用gitk执行整个操作.
gitk --reflog
Run Code Online (Sandbox Code Playgroud)
这将允许您查看分支的提交历史记录,就好像分支尚未删除一样.现在只需右键单击对分支的最新提交,然后选择菜单选项Create new branch.
小智 25
第一种
git reflog
Run Code Online (Sandbox Code Playgroud)
在终端中。
之后,得到HEAD@{**number**}(例如HEAD@{12})。
现在输入:
git checkout -b 'branch_name' 'HEAD@{22}'
Run Code Online (Sandbox Code Playgroud)
Dmi*_*sev 23
最高投票解决方案确实超过了要求:
git checkout <sha>
git checkout -b <branch>
Run Code Online (Sandbox Code Playgroud)
要么
git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)
将您带到新分支以及您可能忘记提交的所有最近更改.这可能不是你的意图,特别是在失去分支后处于"恐慌模式"时.
一个清洁剂(和简单的)解决方案似乎是一个班轮(你找到后<sha>用git reflog):
git branch <branch> <sha>
Run Code Online (Sandbox Code Playgroud)
现在,您当前的分支和未经修改的更改都不会受到影响.相反,只会创建一个新的分支直到<sha>.
如果它不是提示,它仍然可以工作,你得到一个更短的分支,然后你可以重新使用新的<sha>和新的分支名称,直到你做对了.
最后,您可以将成功恢复的分支重命名为它的名称或其他任何内容:
git branch -m <restored branch> <final branch>
Run Code Online (Sandbox Code Playgroud)
不用说,成功的关键是找到正确的提交<sha>,所以明智地命名你的提交:)
Jak*_*ski 14
添加到tfe回答:在Git源代码区域(git.git存储库)中还有git-resurrect.sh脚本contrib/,这可能对您有所帮助.
git-resurrect <name>试图找到一个被称为分支尖端的痕迹<name>,并试图复活它.目前,搜索结果日志以及-r合并消息.使用-m和-t,扫描所有引用的历史Merge <name> into other/Merge <other> into <name>(分别)提交主题,这相当慢,但允许您复活其他人的主题分支.
AHM*_*MED 10
谢谢大家。
我的问题是我删除了 GitLab(远程)和 GIT(本地)上的分支。
但不知何故我得到了我的提交,如下所示:
git log --graph --decorate $(git rev-list -g --all)
Run Code Online (Sandbox Code Playgroud)
git checkout <SHA>
Run Code Online (Sandbox Code Playgroud)
git switch -c <branch-name>
Run Code Online (Sandbox Code Playgroud)
然后我得到了我的提交,我再次推了分支
感谢上帝。
ps:不知何故(SHA)是提交代码
如果您没有reflog,例如.因为您正在一个裸存储库中工作,该存储库没有启用reflog并且最近创建了要恢复的提交,另一个选项是查找最近创建的提交对象并查看它们.
从.git/objects目录内部运行:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
Run Code Online (Sandbox Code Playgroud)
这将查找在过去12小时内创建的所有对象(提交,文件,标签等),并过滤它们以仅显示提交.检查这些是一个快速的过程.
我首先尝试在Jakub的回答中提到的git-ressurect.sh脚本.
对于没有安装Git的GitHub用户:
如果你想从GitHub网站恢复它,你可以破解他们的网站;)
•首先,找到那些SHA(提交哈希):
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
Run Code Online (Sandbox Code Playgroud)
......或私人回购:
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
Run Code Online (Sandbox Code Playgroud)
...(将提示密码)
•接下来,转到GitHub并创建一个新的临时分支,该分支将永久删除(最好是Chrome).
•转到分支机构并删除该分支机构.
• 在同一页面上,无需重新加载,打开DevTools,网络面板.现在准备......
•单击"还原".你会注意到一条新的"线".右键单击它并选择"复制为cURL"并将此文本保存在某个编辑器中.
•附加到复制的代码行的末尾,这一行:curl -i https://api.github.com/repos/PublicUser/PublicRepo/events.
你现在应该得到类似的东西:
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
Run Code Online (Sandbox Code Playgroud)
•最后一步:将"BranchSHA"替换为SHA-hash,并将BranchName替换为所需名称(顺便说一下,从web重命名分支是很好的黑客攻击).如果你不是太慢,你无论如何都需要提出这个要求.例如,只需复制粘贴到终端即可.
PS
我知道,这不是一个非常简单的解决方案或正确的解决方案,但万一有人,没有root密码和虚拟机,在黑客马拉松期间需要做一些奇怪的事情吗?..这是完全真实的,所以谢谢你花时间还有祝你好运 :)
UPDATE
Ahaha,我很高兴万维网上的某个人找到了我的答案,实际上在阅读之后,发现它很有趣或有用,并且提升了我的思绪,疯狂和错误的练习答案:)这是一个美好的世界周围,我们,程序员和程序员,是其中最疯狂的部分之一<3
根据我的理解,如果另一个分支可以访问要删除的分支,则可以使用安全删除它
git branch -d [branch]
Run Code Online (Sandbox Code Playgroud)
你的工作不会丢失.请记住,分支不是快照,而是指向快照的指针.因此,当您删除分支时,您删除了一个指针.
如果删除另一个分支无法访问的分支,您甚至不会失去工作.当然,它不会像检查提交哈希那么容易,但你仍然可以做到.这就是为什么Git无法删除使用无法访问的分支的原因-d.相反,你必须使用
git branch -D [branch]
Run Code Online (Sandbox Code Playgroud)
这是Scott Chacon关于Git的必看视频的一部分.当他谈到分支机构以及如何删除它们时,请在58:00分钟检查.
我使用以下命令来查找和检索已删除的分支.第一步来自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
Run Code Online (Sandbox Code Playgroud)
现在根据提交注释查找git commit id(GIT-SHA)并在下面的命令中使用它.使用之前找到的GIT-SHA签出一个名为NEW-BRANCH的新分支:
$ git checkout -b NEW-BRANCH GIT-SHA
Run Code Online (Sandbox Code Playgroud)
要恢复已删除的分支,首先查看 reflog 历史记录,
git reflog -n 60
Run Code Online (Sandbox Code Playgroud)
其中 n 指的是最后 n 次提交。然后找到合适的头部并使用该头部创建一个分支。
git branch testbranch HEAD@{30}
Run Code Online (Sandbox Code Playgroud)
确保在本地执行所有这些操作,并在推送到 Bitbucket Cloud 之前确认您的存储库处于您想要的状态。克隆您当前的存储库并首先测试这些解决方案也可能是一个好主意。
Deleted branch <your-branch> (was <sha>)
Run Code Online (Sandbox Code Playgroud)
2.要恢复分支,请使用:
git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)
如果您不知道头顶上的“sha”,您可以:
git reflog
Run Code Online (Sandbox Code Playgroud)
git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)
如果您的提交不在您的 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
Run Code Online (Sandbox Code Playgroud)
2. 然后,您可以使用以下方法之一显示每个提交:
git log -p <commit>
git cat-file -p <commit>
Run Code Online (Sandbox Code Playgroud)
如果您删除了分支并忘记了它的提交 ID,则可以执行以下命令:
git log --graph --decorate $(git rev-list -g --all)
Run Code Online (Sandbox Code Playgroud)
在此之后,您将能够看到所有提交。然后你可以做git checkout这个 id 并在这个提交下创建一个新分支。
| 归档时间: |
|
| 查看次数: |
298574 次 |
| 最近记录: |