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

Git:恢复已删除(远程)分支,git,github,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)

我需要恢复在推送过程中不知何故删除的两个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
从他们的出生地机器上取下这些分支并不容易,所以如果可能的话,我想尝试从我的本地机器上恢复它们

我搜索到的所有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

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

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

找到已删除分支的头提交并将其取回。

您已删除的分支不会丢失,它们已通过显示的抓取被复制到源站/联系人页面源站/新图片“远程跟踪分支”(它们也被您显示的推送推送出去,但被推送到refs/remotes/origin/而不是refs/heads/)。检查
git log origin/contact_page
git log origin/new_pictures
以查看您的本地副本是否“最新”如果在您显示的获取和推送之间,有任何新的提交被推送到这些分支上(来自其他某个repo),您可能已经“丢失”了这些分支(但您可能会在最近推送这些分支的其他repo中找到它们)

获取/推送冲突 看起来您是在正常的“远程模式”(远程refs/heads/存储在本地refs/remotes/origin/)下进行抓取,但在“镜像模式”(本地refs/被推到远程refs/)下进行抓取。请检查您的.git/config并协调
remote.origin.fetch
remote.origin.push
设置

备份 在尝试任何更改之前,先做一个简单的tar或zip存档或整个本地repo。这样,如果您不喜欢发生的情况,可以从恢复的repo重试

选项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
您可能最终还希望删除所有的ref/remotes/origin/refs,因为如果您在镜像模式下操作,这些ref/remotes/origin/ref将不起作用(您的普通分支将取代通常的远程跟踪分支)

选项B:重新配置为普通遥控器 但是,由于您似乎正在将此远程回购与多个“工作”回购一起使用,因此您可能不想使用镜像模式。您可以尝试以下方法:

git config push.default tracking &&
git config --unset remote.origin.push
git config --unset remote.origin.mirror
然后,您最终会希望删除远程repo中的伪refs/remotes/origin refs:
git push origin:refs/remotes/origin/contact\u页面:refs/remotes/origin/new\u图片…

试推
尝试
git-push--dry run
查看它
git-push
可以做什么,而不必对远程回购进行任何更改。如果您不喜欢它所说的操作,请从备份中恢复(tar/zip)然后尝试另一个选项。

我认为“fetch”和“push”的配置不匹配,因此这导致默认的fetch/push不能正常往返。幸运的是,您已经获取了随后删除的分支,因此您应该能够通过显式推送重新创建它们

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

数据仍然存在于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

只有两个命令救了我的命

1.这将列出所有以前的标题

2.这将使您删除的头恢复为提交

git重置——硬
例如git复位——硬b4b2c02

这似乎太谨慎了,但在我进行源代码管理更改之前,我经常压缩我一直在做的任何事情的副本。在我正在做的一个Gitlab项目中,我最近错误地删除了一个远程分支,在合并一个合并请求后,我想保留它。事实证明,我所要做的就是用提交历史记录将其恢复s再次推送。合并请求仍由Gitlab跟踪,因此它仍然在分支右侧显示蓝色的“合并”标签。我仍然压缩了本地文件夹,以防发生错误。

如果您的组织使用JIRA或其他绑定到git的类似系统,您可以找到票证上列出的提交,然后单击li代码更改。Github删除分支,但仍有提交可供选择

  • 查找提交id

    git reflog

  • 恢复错误删除的本地分支

    git分行委员会

  • 如果以前也删除了远程分支,则需要再次推送恢复分支名称

    git推送原点


  • 如果删除时间足够近(如“哦,不!”时刻),您应该仍然有一条消息:

    已删除的分支(是abcdefghi)。

    您仍然可以运行:

    git签出abcdefghi


    git checkout-b

    我早些时候试过fsck;你知道如何找出哪个commit是正确的吗?我有20个要试。成功了;一旦我收到commit消息,
    git branch
    就把它们拿回来了。谢谢!很高兴听到这个消息。一定要解决
    遥控器。origin.mirror
    遥控器之间的冲突igin.fetch
    settings,否则您肯定会再次遇到问题(或无意中重击从其他repo推送的提交)。@Craig:很高兴能提供帮助:)我今天丢失了一个发布候选分支。不知道提交id。使用以下方法恢复了它:
    git fsck--full--no reflo
    
    git reflog
    
    git reset --hard <your deleted commit>
    ex. git reset --hard b4b2c02