0Pricing
DevOps Bootcamp · 课时

Git Reflog 与恢复历史

掌握 `git reflog`,恢复丢失的提交或分支,为您的工作提供安全保障。

Git Reflog 与恢复历史 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。

什么是 Git 引用日志?

不小心删除了分支,或者重置到了错误的提交?别慌!Git 有一个强大的安全网,叫作引用日志。

引用日志(引用记录)记录了您的本地仓库中 HEAD 和分支指针曾经指向的位置。

引用日志如何跟踪历史

提交历史(git log)跟踪项目文件中的更改,而引用日志跟踪仓库引用的更改。

每当您的 HEAD(当前提交)或分支指针发生移动时,Git 都会在引用日志中记录这一事件。这包括:

  • 提交更改
  • 切换分支
  • 合并或变基
  • 执行重置
  • 克隆仓库

查看您的引用日志

要查看引用日志,只需使用 git reflog 命令即可。它会显示操作列表,以及当时 HEAD 的状态。

让我们模拟一些操作,然后查看引用日志:

git init my_repo
cd my_repo

echo "First line" > file.txt
git add file.txt
git commit -m "Initial commit"

echo "Second line" >> file.txt
git add file.txt
git commit -m "Add second line"

git reflog

解析引用日志条目

每个引用日志条目都有特定的格式。让我们拆解一个您可能会看到的典型条目:

a1b2c3d HEAD@{0}: commit: Add new feature

  • a1b2c3d:HEAD 当时所在提交的 SHA-1 哈希值。
  • HEAD@{0}:这是“引用日志条目指针”。@{0} 表示最近的状态,@{1} 表示再前一个状态,依此类推。
  • commit: Add new feature:导致 HEAD 移动的操作说明。

这些指针对恢复操作至关重要!

场景:恢复丢失的提交

假设您创建了一个提交,然后不小心使用 git reset --soft HEAD~1 撤销了它。这个提交不再位于当前分支的历史中,但它并没有真正消失!

引用日志还记得它。让我们模拟这个常见的错误:

git init my_project_recovery
cd my_project_recovery

echo "Initial content" > start.txt
git add start.txt
git commit -m "Initial commit"

echo "Important feature" > feature.txt
git add feature.txt
git commit -m "Added an important feature"

# Oops! Accidentally reset
git reset --soft HEAD~1

git reflog

找回提交

重置后,如果运行 git reflog,您会看到“Added an important feature”提交的条目,可能显示为 HEAD@{1} 或类似形式。

要恢复它,可以结合引用日志条目使用 git reset。例如,如果丢失提交的哈希值是 abcdefg,或者它的引用日志条目是 HEAD@{1}:

# Assuming the lost commit was HEAD@{1} in the reflog
git reset --hard HEAD@{1}

# Or using the specific commit hash from reflog
# git reset --hard abcdefg

# Now, check your log. The commit is back!
git log --oneline

场景:找回已删除的分支

如果您在合并整个分支之前不小心将其删除了,或者以为以后不再需要它,该怎么办?

分支只是指向提交的指针。删除分支后,它所指向的提交不会立即从仓库中移除。引用日志仍然记得该分支的 HEAD 曾经位于哪里!

从引用日志恢复分支

假设您有一个名为 feature-x 的分支,在上面进行了一些工作,然后使用 git branch -D feature-x 将其删除。

运行 git reflog 时,您可能会看到类似这样的条目:

1234567 HEAD@{5}: branch: Created branch feature-x 或
abcdefg HEAD@{2}: checkout: moving from feature-x to master

您可以使用分支处于活动状态时对应引用日志条目中的提交哈希值(例如 1234567 或 abcdefg)来重新创建分支:

# Assume 'feature-x' was deleted and its last commit was '1234567'

# Create a new branch pointing to that commit
git branch feature-x-recovered 1234567

# Now, check out your recovered branch
git checkout feature-x-recovered

# Verify its history
git log --oneline

引用日志条目会过期

虽然引用日志是强大的安全网,但其中的条目不会永久保留。Git 会在一段时间后清理旧的引用日志条目。

  • 默认情况下,可达条目(来自当前 HEAD)会在90 天后过期。
  • 不可达条目(例如来自已删除分支,或不再被引用的提交)会在30 天后过期。

这意味着最好尽快恢复“丢失”的工作,而不要拖延!

引用日志恢复挑战

您创建了一个新功能分支,进行了几次提交,然后在未合并的情况下不小心将其删除。您运行 git reflog,看到以下条目:

...
c0ffee1 HEAD@{3}: commit: Implement new user profile page
bada55e HEAD@{4}: checkout: moving from feature/profile to main
...

要正确重新创建 feature/profile 分支,并让它指向删除前该分支拥有的最新提交,应使用哪组命令?

引用日志:Git 的安全网

您已经掌握了 git reflog,这是恢复本地 Git 仓库中“丢失”工作的重要工具。请记住:

  • 它会跟踪 HEAD 和分支指针曾经指向的位置。
  • 使用 git reflog 查看这段历史。
  • 可以结合引用日志条目(HEAD@{n} 或提交哈希值)使用 git reset 或 git branch 来恢复提交或分支。
  • 引用日志条目会过期,因此如果需要恢复内容,请尽快行动!

保持 Git 历史整洁,同时也要知道引用日志可以在紧急情况下提供帮助!

常见问题解答

「Git Reflog 与恢复历史」课时是免费的吗?

是的 — 「Git Reflog 与恢复历史」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。

「Git Reflog 与恢复历史」这节课中我会学到什么?

掌握 `git reflog`,恢复丢失的提交或分支,为您的工作提供安全保障。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DevOps Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「Git Reflog 与恢复历史」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DevOps Bootcamp 课中编写并运行代码吗?

能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Git Reflog 与恢复历史
  2. 使用 Git Bisect 调试
  3. 仓库维护与清理
  4. 使用 git filter-repo 重写历史
← 返回 DevOps Bootcamp