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_page和origin / new_pictures “远程跟踪分支”中(通过显示的推送,它们也被推回去了,但是它们被推送到了refs / remotes /起源/而不是参考/头/)。 检查git log origin/contact_page
和git log origin/new_pictures
来查看你的本地副本是否与你认为应该在那里的“最新”。 如果任何新的提交被推到了你所展示的提取和推送之间的那些分支(从其他回购),你可能已经“丢失”了这些(但是也许你可能在最近推动这些分支的其他回购中find它们) 。
取/推冲突
它看起来像你在一个正常的“远程模式”(远程参考/头/本地存储在refs / remotes / origin /),但推入“镜像模式”(本地参考/被推到远程参考/) 。 检查.git / config并协调remote.origin.fetch
和remote.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跟踪,所以它仍然显示分支右侧的蓝色“合并”标签。 我仍然压缩我的本地文件夹,以防万一发生了什么事情。