我需要恢复在推送过程中以某种方式删除的两个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
将分支机构从他们的出生地机器上取下来并不是非常容易,所以如果可能的话,我想尝试从我的本地恢复它们.
我用google搜索的所有git"撤消"信息都必须恢复丢失的提交.我不认为这适用于此,因为我没有为这些分支提交UID.
我想知道我怎么能得到这些.我也想知道它们是如何被删除的,以及我将来如何避免这种情况.
编辑:根据要求,这是我的repo配置
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
iamamac.. 98
我不是专家.但你可以试试
git fsck --full --no-reflogs | grep commit
找到已删除分支的HEAD提交并将其取回.
我不是专家.但你可以试试
git fsck --full --no-reflogs | grep commit
找到已删除分支的HEAD提交并将其取回.
只有两个命令拯救了我的生命
这将列出所有以前的HEAD
git reflog
2.这将使HEAD恢复为您删除的提交.
git reset --hardex. git reset --hard b4b2c02
您删除的分支不会丢失,它们会被您显示的提取复制到origin/contact_page和origin/new_pictures "远程跟踪分支"(它们也被您展示的推送推回,但它们被推送到refs/remotes/origin /而不是refs/heads /).检查git log origin/contact_page
并git log origin/new_pictures
查看您的本地副本是否与您认为应该存在的任何内容一致.如果任何新的提交被推送到你展示的fetch和push之间的那些分支(来自其他一些repo),你可能会"丢失"那些(但可能你可能会在最近推动这些分支的其他repo中找到它们) .
它看起来像是在正常的"远程模式"(远程refs/heads /本地存储在refs/remotes/origin /中),但推入"镜像模式"(本地引用/被推送到远程引用/) .检查.git/config并协调remote.origin.fetch
和remote.origin.push
设置.
在尝试任何更改之前,请创建一个简单的tar或zip存档或整个本地存储库.这样,如果你不喜欢发生的事情,你可以从恢复的仓库再试一次.
如果您打算将远程仓库用作本地仓库的镜像,请执行以下操作:
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,因为如果您在镜像模式下操作它们是无用的(您的普通分支取代了通常的远程跟踪分支).
但由于您似乎正在使用具有多个"工作"回购的远程仓库,因此您可能不希望使用镜像模式.你可以试试这个:
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)并尝试其他选项.
如果删除是最近的(就像一个哦 - 不!时刻)你仍然应该有一条消息:
Deleted branch
你仍然可以运行:
git checkout abcdefghi
git checkout -b