专业编程基础技术教程

网站首页 > 基础教程 正文

git push --mirror 命令反向操作导致所有远程分支删除的解决办法

ccvgpt 2024-07-18 12:41:27 基础教程 8 ℃

今天客户提了这样一个需要:把当前git仓库 A 迁移到新的空仓库 B 。第一时间想到了用 git push --mirror 命令来进行镜像复制,原本以为很简单的一件事,因为仓库地址搞反了,将 A 仓库的所有远程分支给删除掉了,于是就有了这份笔记。

我们先来看一下 git push --mirror 的正确用法

git push --mirror 命令反向操作导致所有远程分支删除的解决办法

git push --mirror 目标地址(仓库B的地址)

这个条命令正确的操作应该是在仓库 A 的根目录下面执行,代表着复制当前仓库镜像到仓库 B。

结果我将命令彻底弄反了,把目标地址设为了仓库 A 并在仓库 B 的根目录下面执行了该命令,导致仓库 A 除了 master 分支外的所有远程分支都被删除了(master 分支不知道为什么没有被删除掉)。

像这种情况如果你本地分支都在并且是最新的,直接切换到每个分支再次推送一下就可以恢复了。

git checkout 被删除远程分支名称
git push 被删除远程分支名称

但我的情况是本地分支已经好几天没有拉取更新了,不能覆盖远程仓库,所以找网上找了一下,通过以下方法恢复被删除的远程分支,以恢复 dev 分支为例:

以下操作执行前先将代码完整备份一下。

#循环读取远程 refs 下的分支
git for-each-ref refs/remotes/origin

45f572a55a932956da644ab516bc52dfa4aed008 commit refs/remotes/origin/HEAD
a06bbf14d05fd16d61eae604fc4b41946259d61d commit refs/remotes/origin/dev
45f572a55a932956da644ab516bc52dfa4aed008 commit refs/remotes/origin/master

#可以看到列出来所有的分支信息和 commitId ,包括已经被删除的远程 dev 分支。
#如果本地有 dev 分支,需要先删除本地 dev 分支
git checkout master
git branch -d dev
#接下来就是重新建一个同名的本地分支 dev 并将提交记录更新至对应的commitid 节点。
git branch dev a06bbf14d05fd16d61eae604fc4b41946259d61d
#然后将本地 dev 再推送到远程即可
git checkout dev
git push --set-upstream origin dev

至此逐个去恢复分支就可以了,但分支过多的话操作太过繁琐,不知道又会弄出什么新问题来,我看网上有大神写了一个循环分支进行恢复的脚本,贴出来大家可以看一下,反正我是逐个手动恢复的。

#1
for-each-ref refs/remotes/origin | while read sha type name
do 
    git branch "rescue_$(basename "$name")" "$sha"
done

#2
git for-each-ref refs/remotes/origin | while read sha type name; do git branch "rescue_$(basename "$name")" "$sha"; done

这篇文章的重点就是 git for-each-ref refs/remotes/origin 命令,因为之前很少用到这个命令,在网上查了半天才找到,所以记录一下。

注意:

远程分支误删后,如果你的本地分支不是最新,不要推送到远程,这样的话远程分支的commitid 就被刷新了,再使用上述方法恢复,也只是把 head 指向了你本地分支的 commitid

Tags:

最近发表
标签列表