当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Git:恢复已删除的(远程)分支》经验,为你挑选了4个好方法。

我需要恢复在推送过程中以某种方式删除的两个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提交并将其取回.



1> iamamac..:

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

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

找到已删除分支的HEAD提交并将其取回.


@Craig:你必须每次提交`git show`.
我今天失去了候选发布分支。不知道提交ID。通过使用以下命令恢复了它:`git fsck --full --no-reflogs | 切-d''-f3 | xargs -P8 git log --oneline | grep'发布2.60.0.157'`

2> chinnawatp..:

只有两个命令拯救了我的生命

这将列出所有以前的HEAD

git reflog

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

git reset --hard 
ex. git reset --hard b4b2c02



3> Chris Johnse..:

您删除的分支不会丢失,它们会被您显示的提取复制到origin/contact_pageorigin/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)并尝试其他选项.



4> Timmy..:

如果删除是最近的(就像一个哦 - 不!时刻)你仍然应该有一条消息:

Deleted branch (was abcdefghi).

你仍然可以运行:

git checkout abcdefghi

git checkout -b

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有