一次完整的 Git 提交撤销与代码恢复经历

一次完整的 Git 提交撤销与代码恢复经历

大家好,我是在使用 Git 时遇到了一系列连锁问题,最终有惊无险地解决了。我把整个过程记录下来,希望能帮助到有同样困扰的朋友,让大家能更安全地操作 Git。

1. 起因:撤销一次错误的提交

故事的开始是,我不小心将一些不需要的文件提交到了本地仓库,并且已经 push 到了远程。我希望可以彻底撤销这次提交,让本地和远程的提交记录都消失,就像这次提交从未发生过一样。

为了达到这个目的,我执行了以下两个命令:

  1. git reset --hard HEAD~1:这个命令会丢弃本地最新的一次提交,并将代码库的指针指向上一个版本。
  2. git push --force:这个命令会强制将我本地的修改推送到远程仓库,从而覆盖掉远程的提交记录。

这两个命令成功地达成了我最初的目标------远程和本地的提交记录确实被清除了。

2. 问题:代码意外丢失

然而,一个我没预料到的问题发生了。在执行 git reset --hard 后,我发现我本地所有未提交 的更改也全部消失了。这个 --hard 参数非常"硬核",它会无情地丢弃所有工作目录和暂存区的更改。

这让我非常焦虑,因为我花了很多时间写的代码,就因为这个操作而凭空消失了。

3. 解决方案:恢复丢失的代码

幸运的是,Git 提供了"后悔药"。通过以下两个步骤,我成功地找回了所有丢失的代码。

步骤一:找到丢失代码的"时光机入口"

首先,我在项目根目录下打开终端,执行了 git reflog 命令。这个命令会列出你在这个仓库里的所有操作记录,包括每一次 commitreset 等。

bash 复制代码
$ git reflog

32ed772 HEAD@{0}: reset: moving to HEAD~1
22a9d28 HEAD@{1}: commit: refactor(identity): 重构身份认证服务错误处理机制
32ed772 HEAD@{2}: commit (amend): refactor(api-gateway): 重构错误处理机制
...

在输出的列表中,我找到了在我执行 reset 命令之前的那次提交,它的哈希值是 22a9d28。这个哈希值就是我找回代码的关键。

步骤二:恢复代码

找到 commit 哈希值后,我执行了以下命令:

bash 复制代码
# 将 22a9d28 替换成你从 reflog 中找到的哈希值
git checkout 22a9d28 -- .

这个命令的作用是,从 22a9d28 这次提交中,检出(checkout)所有的文件(. 代表所有文件),并用它们覆盖当前工作目录中的文件。

执行完这个命令后,我再运行 git status,惊喜地发现,所有丢失的代码都回来了,并且它们都处于暂存(staged)状态,可以直接进行下一次提交。

4. 总结与建议

这次经历让我学到了两个非常重要的教训:

  1. 谨慎使用 git reset --hard :这是一个非常危险的命令。在执行它之前,一定要三思,确保所有重要的更改(无论是否提交)都已经备份。如果只是想撤销提交但保留代码,应优先考虑 git reset --soft HEAD~1

  2. git reflog 是终极"后悔药" :当你发现自己搞砸了什么事情时,不要慌张,先用 git reflog 看一下你的操作历史,很大概率能找到恢复的方法。它是你在 Git 世界里最可靠的保障。

希望这个完整的经历能帮助到大家,让我们都能更安全、更自信地使用 Git!

相关推荐
猫头虎12 小时前
2026全网最热Claude Skills工具箱,GitHub上最受欢迎的7大Skills开源AI技能库
langchain·开源·prompt·github·aigc·ai编程·agi
CoderJia程序员甲13 小时前
GitHub 热榜项目 - 日榜(2026-02-03)
git·ai·开源·llm·github
MicrosoftReactor15 小时前
技术速递|使用 GitHub Copilot SDK 将智能体集成到任何应用中
ai·github·copilot
极智-9961 天前
GitHub 热榜项目-日榜精选(2026-02-02)| AI智能体、终端工具、视频生成等 | openclaw、99、Maestro等
人工智能·github·视频生成·终端工具·ai智能体·电子书管理·rust工具
樱花落海洋1111 天前
GitHub DeskTop Can`t find URP项目
github
我的golang之路果然有问题1 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
codezzzsleep1 天前
fuClaudeBackend:面向fuclaude的轻量后端代理 + Key 管理后台
ai·github·ai编程
kjzd1231 天前
GitHub 热门项目趋势分析报告 (2026年2月2日)
github
LostSpeed1 天前
git - github工程中不能包含大文件
git·github
CoderJia程序员甲1 天前
GitHub 热榜项目 - 日榜(2026-02-02)
人工智能·ai·大模型·github·ai教程