今天操作项目的时候,不小心把 .git 目录删了。
代码文件都在,但 git status 已经跑不了了,git 信息全没了。
这个项目是一个 Vue3 的后台管理系统,远程仓库在 Gitee 上。我不想重新 git init 然后强推,那样会和远程仓库的历史完全断裂,后面协作会出大问题。
所以目标很明确:在不丢失远程提交记录的前提下,重新把本地代码和远程仓库连起来。
先说结论
四步搞定:
git init
git remote add origin https://gitee.com/your-org/your-project.git
git fetch origin
git reset --hard origin/master注意最后一个参数,是 origin/master 不是 origin/main。这个坑下面单独讲。
具体操作过程
第一步:重新初始化本地仓库
git init这一步只是在当前目录重新创建一个空的 .git 目录,不会影响你的代码文件。
第二步:重新添加远程仓库地址
git remote add origin https://gitee.com/your-org/your-project.git把你的远程仓库地址换成你自己的就行。如果是 GitHub,地址格式一样,只是域名不同。
第三步:从远程拉取分支信息
git fetch origin这一步会把远程的所有分支和提交记录拉到本地。拉完之后我看到的输出是:
* [new branch] master -> origin/master注意这里已经暴露了一个关键信息:远程的主分支叫 master,不叫 main。
第四步:重置本地代码到远程分支
git reset --hard origin/master执行完之后显示:
HEAD is now at af7bc9f first commit到这里代码就已经和远程完全一致了。
踩坑:分支名不匹配
一开始我本能地写了:
git reset --hard origin/main然后报了这个错:
fatal: ambiguous argument 'origin/main': unknown revision or path not in the working tree.这个报错不算直观,ambiguous argument 看起来像参数格式问题,但实际原因很简单:远程根本没有 main 分支,只有 master 分支。
现在 Git 的默认主分支名确实是 main,但很多老项目、Gitee 上不少项目用的还是 master。所以 git fetch 完之后,先看看拉下来的是什么分支名,再执行 reset。
一个简单的判断方法:git fetch 之后,跑一下 git branch -r 就能看到远程有哪些分支。
最后设置上游跟踪
reset 之后我检查了一下状态,发现 upstream 还没配。执行:
git branch --set-upstream-to=origin/master master这样后续 git pull 和 git push 就能正常追踪远程分支了,不用每次手动指定。
这次操作的前提
有一点要注意:这套操作能成功,是因为远程仓库的代码和我本地删 .git 之前的代码基本一致。
如果本地有很多未提交的新改动,git reset --hard 之后这些改动会全部丢掉。所以如果你本地有未提交的代码,建议先备份一份,reset 之后再手动合进去。
我这次的情况是本地有两个未跟踪的新目录,是新加的接口和页面文件。因为还没 add 过,所以 git reset --hard 不会影响它们——hard reset 只作用于已经被 git 跟踪的文件。
总结
| 步骤 | 命令 | 作用 |
|---|---|---|
| 初始化 | git init | 创建空 .git 目录 |
| 添加远程 | git remote add origin <url> | 关联远程仓库 |
| 拉取分支 | git fetch origin | 获取远程分支信息 |
| 重置代码 | git reset --hard origin/<branch> | 对齐到远程分支 |
| 设置跟踪 | git branch --set-upstream-to=origin/<branch> <branch> | 配置上下游关系 |
整个过程不到两分钟,代码没丢,历史没断,和直接 git clone 一个新仓库效果一样。
以后万一再遇到 .git 被误删的情况,别慌,照着来就行。
评论0
暂时没有评论