[git] 如何找到已经“丢失”的 commit?

背景

在日常开发时,偶尔会出现不小心"丢失"某个 commit 的情况,那么此时是否还有办法补救呢?本文会探讨这个问题。

正文

为了便于讨论,我们来杜撰一个例子 ⬇️

示例

准备工作

请将以下代码保存为 main.sh (具体的名称并不重要)

bash 复制代码
mkdir temp
cd temp
touch 唐诗.md

git init

# For 1st commit
echo "向晚意不適 驅車登古原 夕陽無限好 只是近黃昏" >> 唐诗.md
git add 唐诗.md
git commit --message "1st commit for 李商隱 樂遊原"

# For 2nd commit
echo "春眠不覺曉 處處聞啼鳥 夜來風雨聲 花落知多少" >> 唐诗.md
git add 唐诗.md
git commit --message "2nd commit for 孟浩然 春曉"

# For 3rd commit
echo "千山鳥飛絕 萬徑人蹤滅 孤舟簑笠翁 獨釣寒江雪" >> 唐诗.md
git add 唐诗.md
git commit --message "3rd commit for 柳宗元 江雪"

main.sh 会在当前目录下创建一个名为 temp 的子目录,然后让 git 来管理这个子目录的内容。

执行如下命令就可以运行 main.sh 中的各个命令。

bash 复制代码
bash main.sh

我们通过 cd temp 切换到 temp 子目录中,使用如下命令就可以看到各个 commit 的简要信息 ⬇️

bash 复制代码
git log --pretty=oneline

在我的电脑上,看到的结果如下(在您的电脑上,各个 commit 的 hash 值应该会是其他值)

text 复制代码
42f48ebfc8bd80f2100f00ddf827b1700098e70d (HEAD -> main) 3rd commit for 柳宗元 江雪
5a8359bcb69c707878e73f48b5a1febc15c62a8b 2nd commit for 孟浩然 春曉
bc5628e51aa18cfe54d9dd1036d490b2ee7a81fd 1st commit for 李商隱 樂遊原

借助 IntelliJ IDEA (Community Edition) 看到的效果如下 ⬇️

模拟 commit 丢失的场景

现在我们来模拟某些 commit 丢失的场景。在 temp 子目录内,通过执行以下命令,我们可以让 main 分支回到第一个 commit

bash 复制代码
git reset --hard HEAD~2

IntelliJ IDEA (Community Edition) 看到的最新效果如下 ⬇️

看来最新的两个 commit 都被弄丢了 😱 我们成功模拟了 commit 丢失的场景。

恢复

此时应该如何恢复丢失的那两个 commit 呢?我们可以借助 git reflog 命令。执行 git reflog 命令后,我看到的结果如下 (在您的电脑上,各个 commit 的 hash 值可能会是其他值)

其中红框里的那个 commit 就是我们想退回的地方。保险起见,我们先把当前分支做个备份 ⬇️

bash 复制代码
git checkout -b main_backup
git checkout main

然后再执行如下命令就可以让 main 分支回到过去的位置了 (请注意:在您的电脑上,最新的那个 commit 很可能是是其他值,所以不能直接复制下方的命令)

bash 复制代码
git reset --hard 42f48eb

执行完命令后,在 IntelliJ IDEA (Community Edition) 检查一下 ⬇️ 结果符合预期

参考资料

以下两个链接来自同一个网站,只是语言不同,第一个链接的内容是简体中文,第二个链接的内容是英语

相关推荐
红尘散仙5 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记6 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆6 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪7 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6167 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364577 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao7 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒9 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
ayqy贾杰10 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox10 小时前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全