Featured image of post 使用 git reflog 恢复已删除的分支和提交Featured image of post 使用 git reflog 恢复已删除的分支和提交

使用 git reflog 恢复已删除的分支和提交

使用 git reflog 的本地事务历史记录跟踪来恢复恐慌分支丢失和松散提交指针。

“我不小心使用 git branch -D 删除了本地分支”,或者“我运行了 git reset --hard HEAD~1 并丢失了我未推送的提交!”如果您使用 Git 工作过一段时间,您可能经历过这些令人胃口大开的时刻之一。

虽然标准 git log 命令不会显示对已删除分支或分离提交的引用,但您无需惊慌。 Git 有一个名为 git reflog 的内置安全网。

在本指南中,我们将探索如何使用 git reflog 跟踪的本地事务历史记录来检索丢失的提交并恢复已删除的分支。


1.什么是git reflog

git reflog(参考日志)是您的 HEAD(当前工作区指针)随着时间的推移所指向的位置的日志。

虽然常规 git log 映射永久公共提交结构(DAG 树),但 git reflog 跟踪您在本地执行的每个私有命令,包括:

  • 结帐(切换分支)
  • 提交和提交修改
  • 重置 (git reset)
  • 合并和变基
  • 拉取和获取

引用日志条目完全是本地的,不会推送到远程。默认情况下,Git 会将这些日志保留 30 到 90 天,然后垃圾收集会将其清除。这意味着如果您在保留期结束之前采取行动,几乎所有“丢失”的提交都可以恢复。


2. 恢复意外删除的分支

如果您删除了尚未合并或推送到远程的分支,请按照以下步骤进行救援。

第 1 步:打印引用日志历史记录

打开终端并运行:

git reflog

您将看到类似于以下内容的输出:

7c2a1b3 HEAD@{0}: checkout: moving from feature-auth to main
8f9e0d1 HEAD@{1}: commit: feat: implement login API validation
5a4c3d2 HEAD@{2}: commit: feat: design login interface layout
...

步骤 2:找到已删除分支的最后一次提交

查看日志条目以确定您仍在处理已删除分支 (feature-auth) 的时刻。在此示例中,该分支的最后一个有效状态是提交 8f9e0d1 (“功能:实现登录 API 验证”)。

第 3 步:从提交哈希重新创建分支

要恢复此确切提交的分支,请运行:

git branch feature-auth 8f9e0d1

您删除的分支现已完全恢复,并包含其所有提交。


3. 从危险的硬重置中恢复

如果您运行了像 git reset --hard 这样的破坏性命令并清除了本地提交,则可以反转时钟。

第 1 步:在重置之前确定提交

运行 git reflog 来检查时间线:

3b2a1c9 HEAD@{0}: reset: moving to HEAD~1
9e8d7c6 HEAD@{1}: commit: feat: complex payment integration

在这里,我们可以看到重置发生在 HEAD@{0},远离 HEAD@{1} (哈希 9e8d7c6),其中包含我们丢失的付款集成提交。

第 2 步:启动救援分支

最安全的方法是从目标哈希创建一个新分支,而不是冒着在当前分支上再次硬重置的风险:

git checkout -b rescue-branch 9e8d7c6

您现在可以将此救援分支合并回您的开发分支或直接从此处继续工作。


结论

git reflog 是您当地的保险单。记住:

  1. ** HEAD 指针的任何移动都会在本地进行跟踪。**
  2. 只要你知道提交哈希,你就可以重建或检查任何历史点。
  3. 在 Git 的垃圾收集永久删除无法访问的对象之前迅速采取行动。

下次当 Git 命令没有按计划执行时,请记住这个工具。