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

参考资料

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

相关推荐
IT_陈寒1 天前
JavaScript闭包的这个坑,我居然今天才爬出来
前端·人工智能·后端
Thneonl1 天前
消息队列选型决策树:RabbitMQ vs Kafka vs Redis Streams
后端·架构
晚安日记wanna1 天前
大厂禁 JOIN 的真正原因,拆到第四层才清楚
数据库·后端·面试
dd聊技术1 天前
LLM 说"你这篇和已有文章 92% 相似",我去查了——它编的
后端
行百里er1 天前
Redis 持久化——RDB 快照 vs AOF 日志
redis·后端
Ysx1 天前
踩了 5 次"本地全绿、生产失效"之后,我把交付流程做成了 SOP
后端·程序员
pippocao1 天前
王者荣耀日志组件BqLog为什么这么快之2——从环形队列到自适应数据总线
后端
孟健1 天前
Stripe出海收款架构设计:水星银行与香港账户实测对比与资金流闭环
后端·架构
sunshine22 girl1 天前
git tag-项目流程
git
程序员cxuan1 天前
DeepSeek Harness 出了桌面端?我把它扒了一遍
人工智能·后端·程序员