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

时间:2010-01-02 18:30:19

标签: git github

我需要恢复在推送过程中以某种方式删除的两个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

9 个答案:

答案 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_pagegit log origin/new_pictures,看看您的本地副本是否与您认为的最新版本一致。如果任何新的提交被推送到你展示的fetch和push之间的那些分支(来自其他一些repo),你可能会“丢失”那些(但可能你可能会在最近推动那些分支的其他repo中找到它们)

获取/推送冲突

看起来你正在以正常的'远程模式'(远程refs / heads /本地存储在refs / remotes / origin /中),但推入'镜像模式'(本地引用/被推到远程模式)裁判/)。检查您的.git / config并核对remote.origin.fetchremote.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

您最终可能还想删除所有refs / remotes / origin / refs,因为如果您在镜像模式下操作它们没有用(您的普通分支取代了通常的远程跟踪分支)。

选项B:重新配置为普通遥控器

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

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)

  1. 找出coimmit id
      

    git reflog

  2. 恢复您错误删除的本地分支
      

    git branch need-recover-branch-name commitId

  3. 如果您之前删除了远程分支,则
  4. 再次推送need-recover-branch-name
      

    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跟踪,因此它仍然显示分支右侧的蓝色“合并”标签。我仍然压缩我的本地文件夹以防万一发生了不好的事情。