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

我需要恢复两个Git分支,在推送过程中以某种方式删除。

这两个分支在不同的系统上创build,然后推送到我的“共享”(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 

将分支从他们的出生地机器中取出并不容易,所以如果可能的话,我想尝试从我的本地恢复它们。

我所search到的所有git“撤销”信息必须与恢复丢失的提交。 我不认为这适用于这里,因为我没有提交这些分支的UID。

我想知道如何让这些回来。 我也想知道他们是如何被删除的,我怎么能在将来避免这种情况。

编辑:请求,这是我的回购configuration

 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 -- remote.ci.url=ContinuousIntegrationGitURL remote.ci.fetch=+refs/heads/*:refs/remotes/ci/* branch.photo.remote=origin branch.photo.merge=refs/heads/photos remote.foo.url=FooGitURL remote.foo.fetch=+refs/heads/*:refs/remotes/cynthia/* branch.homepage.remote=origin branch.homepage.merge=refs/heads/homepage 

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

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

find已删除分支的HEAD提交并将其还原。

你删除的分支不会丢失,它们被复制到origin / contact_pageorigin / new_pictures “远程跟踪分支”中(通过显示的推送,它们也被推回去了,但是它们被推送到了refs / remotes /起源/而不是参考/头/)。 检查git log origin/contact_pagegit log origin/new_pictures来查看你的本地副本是否与你认为应该在那里的“最新”。 如果任何新的提交被推到了你所展示的提取和推送之间的那些分支(从其他回购),你可能已经“丢失”了这些(但是也许你可能在最近推动这些分支的其他回购中find它们) 。

取/推冲突

它看起来像你在一个正常的“远程模式”(远程参考/头/本地存储在refs / remotes / origin /),但推入“镜像模式”(本地参考/被推到远程参考/) 。 检查.git / config并协调remote.origin.fetchremote.origin.push设置。

做一个备份

在尝试任何更改之前,请制作一个简单的tar或zip存档或您的整个本地存储库。 这样,如果你不喜欢发生什么事情,你可以从恢复的回购再次尝试。

选项A:重新configuration为镜像

如果您打算使用远程回购作为本地镜像,请执行以下操作:

 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 

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

选项B:重新configuration为普通远程

但是,由于您似乎正在使用这个远程回购多个“工作”回购,你可能不想使用镜像模式。 你可以试试这个:

 git config push.default tracking && git config --unset remote.origin.push git config --unset remote.origin.mirror 

然后,你最终想要删除远程库中的伪造/远程/原始参考: git push origin :refs/remotes/origin/contact_page :refs/remotes/origin/new_pictures …

testing推

试试git push --dry-run ,看看git push会做什么,而不用在远程repo上做任何改变。 如果你不喜欢它要做的事情,从备份中恢复(tar / zip),然后尝试其他的选项。

只有两个命令拯救了我的生命

这将列出所有以前的HEAD

 git reflog 

2.这将使HEAD恢复提交你删除。

 git reset --hard <your deleted commit> ex. git reset --hard b4b2c02 

数据仍然存在于github中,您可以从旧数据创build一个新的分支:

 git checkout origin/BranchName #get a readonly pointer to the old branch git checkout –b BranchName #create a new branch from the old git push origin BranchName #publish the new branch 

我认为你有一个'fetch'和'push'的configuration不匹配,所以这导致默认的读取/推送不能正确地往返。 幸运的是,您已经提取了您随后删除的分支,所以您应该能够通过明确的推送重新创build它们。

 git push origin origin/contact_page:contact_page origin/new_pictures:new_pictures 

如果您的组织使用JIRA或其他类似系统绑定到git,您可以find票上列出的提交本身,并单击代码更改的链接。 Github删除了分支,但仍然有可用于樱桃采摘的提交。

这可能看起来太谨慎了,但是在我做源代码pipe理变更之前,我经常会压缩一个我正在处理的东西的副本。 在我正在开发的一个Gitlab项目中,我最近删除了一个错误的远程分支,我想在合并请求之后保留这个远程分支。 事实certificate,我必须做的才能重新提交提交历史logging。 合并请求仍然由Gitlab跟踪,所以它仍然显示分支右侧的蓝色“合并”标签。 我仍然压缩我的本地文件夹,以防万一发生了什么事情。