我需要恢复在推送过程中以某种方式删除的两个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。
我想知道如何才能得到这些。我也想知道它们是如何被删除的,以及我将来如何避免这种情况。
编辑:根据要求,这是我的回购配置
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
答案 0 :(得分:94)
我不是专家。但你可以尝试
git fsck --full --no-reflogs | grep commit
找到已删除分支的HEAD提交并将其取回。
答案 1 :(得分:17)
只有两个命令可以挽救我的生命
1。这将列出所有以前的HEAD
git reflog
2。这将使HEAD恢复为您删除的提交。
git reset --hard <your deleted commit>
ex. git reset --hard b4b2c02
答案 2 :(得分:11)
您删除的分支机构不会丢失,它们会被您展示的抓取内容复制到 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)并尝试其他选项。
答案 3 :(得分:5)
如果删除的时间足够近(例如,哦,不,请稍等),您仍然应该收到一条消息:
^(<Mansion\s*"/.*/.*">)((?:\n(?!.*(?:walls\s(floor|windows)+.*\n|</Mansion>)).*)*\n</Mansion>)$
您仍然可以运行:
Deleted branch <branch name> (was abcdefghi).
git checkout abcdefghi
答案 4 :(得分:2)
数据仍然存在于github中,您可以从旧数据创建一个新分支:
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
答案 5 :(得分:2)
git reflog
git branch need-recover-branch-name commitId
git push origin need-recover-branch-name
答案 6 :(得分:1)
我认为你的'fetch'和'push'配置不匹配,所以这导致默认的fetch / push不能正常往返。幸运的是,您已经获取了随后删除的分支,因此您应该能够通过显式推送重新创建它们。
git push origin origin/contact_page:contact_page origin/new_pictures:new_pictures
答案 7 :(得分:0)
如果您的组织使用JIRA或与git绑定的其他类似系统,您可以找到故障单上列出的提交,然后单击代码更改的链接。 Github删除了分支,但仍然有提交樱桃的提交。
答案 8 :(得分:-1)
它可能看起来过于谨慎,但在进行源代码管理更改之前,我经常会压缩一份我正在处理的内容。在我正在研究的Gitlab项目中,我最近错误地删除了一个远程分支,我想在合并合并请求后保留它。事实证明,我必须做的就是将提交历史记录重新推回。合并请求仍由Gitlab跟踪,因此它仍然显示分支右侧的蓝色“合并”标签。我仍然压缩我的本地文件夹以防万一发生了不好的事情。