猿问

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

我需要恢复在推送期间以某种方式删除的两个Git分支。


这两个分支是在不同的系统上创建的,然后被推送到我的“共享”(github)存储库中。


在我的系统上,我(显然)在获取期间检索了分支:


~/myfolder> git fetch

remote: 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 push

Counting 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 Walker

user.email=github@softcraft.ca

alias.unadd=reset HEAD

core.repositoryformatversion=0

core.filemode=true

core.bare=false

core.logallrefupdates=true

core.ignorecase=true

remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

remote.origin.url=git@github.com:MyGitURL.git

remote.origin.mirror=true

branch.master.remote=origin

branch.master.merge=refs/heads/master

alias.undo=reset --hard

alias.test=push -f ci HEAD:master

alias.st=status

alias.ci=commit

alias.br=branch

alias.co=checkout

alias.ch=checkout

alias.df=diff

alias.lg=log -p

alias.who=shortlog -s --


慕的地6264312
浏览 5267回答 4
4回答

开心每一天1111

我不是专家。但是你可以尝试git fsck --full --no-reflogs | grep commit查找已删除分支的HEAD提交并将其取回。

尚方宝剑之说

仅有两个命令可以挽救我的生命1.这将列出所有先前的HEADgit reflog2.这将还原HEAD以提交您删除的内容。git reset --hard <your deleted commit>ex. git reset --hard b4b2c02

慕桂英3389331

您删除的分支不会丢失,它们会通过您显示的获取操作复制到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.pushgit 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)中恢复并尝试其他选择。
随时随地看视频慕课网APP
我要回答