为了账号安全,请及时绑定邮箱和手机立即绑定

Git:恢复已删除(远程)分支

Git:恢复已删除(远程)分支

Git
慕的地6264312 2019-10-08 14:48:28
我需要恢复在推送期间以某种方式删除的两个Git分支。这两个分支是在不同的系统上创建的,然后被推送到我的“共享”(github)存储库中。在我的系统上,我(显然)在获取期间检索了分支:~/myfolder> git fetchremote: Counting objects: 105, done.remote: Compressing objects: 100% (58/58), done.remote: Total 62 (delta 29), reused 0 (delta 0)Unpacking objects: 100% (62/62), done.From github.com:mygiturl * [new branch]      contact_page -> origin/contact_page   731d1bb..e8b68cc  homepage   -> origin/homepage * [new branch]      new_pictures -> origin/new_pictures之后,我立即将本地更改发送到中央存储库。由于某些原因,这些分支已从我的本地系统和中央存储库中删除:~/myfolder> git pushCounting objects: 71, done.Delta compression using up to 2 threads.Compressing objects: 100% (43/43), done.Writing objects: 100% (49/49), 4.99 KiB, done.Total 49 (delta 33), reused 0 (delta 0)To git@github.com:mygiturl.git - [deleted]         contact_page + e8b68cc...731d1bb homepage -> homepage (forced update)   bb7e9f2..e0d061c  master -> master - [deleted]         new_pictures   e38ac2e..bb7e9f2  origin/HEAD -> origin/HEAD   731d1bb..e8b68cc  origin/homepage -> origin/homepage   e38ac2e..bb7e9f2  origin/master -> origin/master * [new branch]      origin/contact_page -> origin/contact_page * [new branch]      origin/new_pictures -> origin/new_pictures从分支机构的机器上卸下分支并不是一件容易的事,因此,我想尝试从本地恢复这些分支。我搜索过的所有git“撤消”信息都与恢复丢失的提交有关。我认为这并不适用,因为我没有这些分支的提交UID。我想知道如何找回这些。我还想知道如何首先删除它们,以及将来如何避免这种情况。编辑:根据要求,这是我的回购配置user.name=Craig Walkeruser.email=github@softcraft.caalias.unadd=reset HEADcore.repositoryformatversion=0core.filemode=truecore.bare=falsecore.logallrefupdates=truecore.ignorecase=trueremote.origin.fetch=+refs/heads/*:refs/remotes/origin/*remote.origin.url=git@github.com:MyGitURL.gitremote.origin.mirror=truebranch.master.remote=originbranch.master.merge=refs/heads/masteralias.undo=reset --hardalias.test=push -f ci HEAD:masteralias.st=statusalias.ci=commitalias.br=branchalias.co=checkoutalias.ch=checkoutalias.df=diffalias.lg=log -palias.who=shortlog -s --
查看完整描述

4 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

我不是专家。但是你可以尝试


git fsck --full --no-reflogs | grep commit

查找已删除分支的HEAD提交并将其取回。


查看完整回答
反对 回复 2019-10-08
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

仅有两个命令可以挽救我的生命


1.这将列出所有先前的HEAD


git reflog

2.这将还原HEAD以提交您删除的内容。


git reset --hard <your deleted commit>

ex. git reset --hard b4b2c02


查看完整回答
反对 回复 2019-10-08
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

您删除的分支不会丢失,它们会通过您显示的获取操作复制到origin / contact_page和origin / new_pictures的 “远程跟踪分支”中(它们也通过您显示的推送而被撤回,但它们已被推送到ref / remotes / origin /而不是refs / heads /)。检查git log origin/contact_page并git log origin/new_pictures查看您的本地副本是否“最新”,以及您认为应该存在的内容。如果在您显示的获取和推送之间有任何新的提交(从其他回购)推送到那些分支上,则可能“丢失”了那些(但您可能会在最近推送这些分支的另一个回购中找到它们) 。


提取/推送冲突

看来您是以正常的“远程模式”获取(远程ref / heads /本地存储在refs / remotes / origin /中),但是以“镜像模式”推送(本地ref /被推送到远程ref /) 。检查您的.git / config并协调remote.origin.fetch和remote.origin.push设置。


进行备份

在尝试任何更改之前,请做一个简单的tar或zip归档文件或整个本地存储库。这样,如果您不喜欢发生的情况,则可以从已还原的存储库中重试。


选项A:重新配置为镜像

如果打算将远程存储库用作本地存储库的镜像,请执行以下操作:


git branch contact_page origin/contact_page &&

git branch new_pictures origin/new_pictures &&

git config remote.origin.fetch '+refs/*:refs/*' &&

git config --unset remote.origin.push &&

git config remote.origin.mirror true

您最终可能还希望删除所有的ref / remotes / origin / refs,因为如果您在镜像模式下运行,它们将无用(您的普通分支代替了通常的远程跟踪分支)。


选项B:重新配置为普通遥控器

但是,由于您似乎正在将这个远程存储库与多个“工作”存储库一起使用,因此您可能不想使用镜像模式。您可以尝试以下方法:


git config push.default tracking &&

git config --unset remote.origin.push

git config --unset remote.origin.mirror

然后,您最终将要删除远程回购中的伪造的refs / remotes / origin refs git push origin :refs/remotes/origin/contact_page :refs/remotes/origin/new_pictures …。


测试推送

尝试git push --dry-run看看它git push会做什么,而无需在远程仓库上进行任何更改。如果您不喜欢它说的那样,请从备份(tar / zip)中恢复并尝试其他选择。


查看完整回答
反对 回复 2019-10-08
  • 4 回答
  • 0 关注
  • 5266 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信