基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

不小心删除了一个还未合并的本地分支,有办法恢复吗?

知识点图片

别慌!只要你在那个分支上执行过 git commit,大概率是可以100%恢复的。

Git 的机制是:删除分支仅仅是删除了指向那个提交(commit)的指针,你之前提交的代码实际上并没有被立刻销毁,而是变成了“悬空提交”(dangling commit),只要 Git 还没有进行垃圾回收(git gc),就能找回来。

你可以按照以下两种方法进行恢复:

方法一:使用 git reflog(最简单常用)

git reflog 会记录你本地仓库所有 HEAD 的变动(包括切换分支、提交代码、合并等)。

步骤 1:查看操作记录
在终端(Terminal)中输入以下命令:

bash
git reflog

步骤 2:找到丢失分支的最后一次 commit Hash
你会看到类似这样的输出列表:

7a8b9c0 HEAD@{0}: checkout: moving from feature-branch to main
1d2e3f4 HEAD@{1}: commit: 完成了登录功能的接口对接 <-- 假设这是你误删分支上的最后一次提交
5g6h7i8 HEAD@{2}: commit: 初始化登录页面

仔细回忆你的 commit message 或者分支名,找到属于那个被删分支的最后一次提交的哈希值(Hash)(比如上面例子中的 1d2e3f4)。

步骤 3:根据 Hash 恢复分支
使用以下命令,根据找到的 Hash 值重新创建一个分支:

bash
git checkout -b <你想要的分支名> <找到的Hash值>

# 例如:
git checkout -b feature-branch 1d2e3f4

这样,你的分支和代码就完美恢复了!


方法二:使用 git fsck(如果 reflog 记录太多找不到)

如果你进行了太多操作,reflog 里很难找,可以用 fsck 专门找出那些“无家可归”的提交。

步骤 1:查找悬空提交
输入以下命令:

bash
git fsck --lost-found

你会看到一堆类似这样的输出:

dangling commit 9f8e7d6c5b4a3...
dangling blob 1a2b3c4d5e6f7...

步骤 2:确认是哪个 commit
复制 dangling commit 后面的那串长字符,使用 git show 命令看看它的内容是不是你丢失的代码:

bash
git show 9f8e7d6c5b4a3

步骤 3:恢复分支
一旦确认是你的代码,同样使用 checkout -b 恢复:

bash
git checkout -b <你想要的分支名> 9f8e7d6c5b4a3

⚠️ 极限情况警告:如果你“没有”进行过 Commit 怎么办?

如果你在那个分支上写了代码,但是连一次 git commit 都还没做就把分支强行删除了(或者执行了硬重置),Git 是无法通过上述方法恢复的。

这种情况下唯一的救命稻草是你的代码编辑器/IDE

  • VS Code: 在左侧资源管理器中,右键点击文件夹 -> 选择 "Timeline"(时间线),或者使用插件 Local History
  • WebStorm / IntelliJ IDEA: 在项目目录上右键 -> Local History -> Show History,这里会记录你对文件的每一次按键保存,绝对能找回来。
00:00
00:00