[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) 检查一下 ⬇️ 结果符合预期

参考资料

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

相关推荐
无风听海4 小时前
深入剖析 YARP 的 Transforms:构建灵活的反向代理转换管道
后端·中间件·asp.net
Gopher_HBo5 小时前
负载均衡
后端
自由生长20245 小时前
RAG已死?什么标题党啊!
后端
东方小月6 小时前
5分钟搞懂Harness Engineering(驾驭工程):从提示词到AI Agent的进化之路
前端·后端·架构
折哥的程序人生 · 物流技术专研8 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试
Moment9 小时前
面试官:如果产品经理给你多个需求,怎么让AI去完成❓❓❓
前端·后端·面试
每天进步一点_JL10 小时前
JVM 内存模型与 OOM 排查:从入门到实战
后端
REDcker10 小时前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站
Supersist10 小时前
【设计模式03】使用模版模式+责任链模式优化实战
后端·设计模式·代码规范
Fox爱分享10 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试