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

参考资料

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

相关推荐
消失的旧时光-19432 小时前
Spring Boot 核心机制之 @Conditional:从原理到实战(一次讲透)
java·spring boot·后端
huabiangaozhi2 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
fliter2 小时前
Rust 1.88 终于稳定了裸函数:写汇编不再需要那堆样板代码
后端
武子康2 小时前
大数据-271 Spark MLib-基础线性回归详解:从原理到损失优化实战
大数据·后端·spark
尘世壹俗人2 小时前
linux编译安装git
linux·运维·git
Postkarte不想说话2 小时前
LangChain使用入门
后端
xyyaihxl2 小时前
将 vue3 项目打包后部署在 springboot 项目运行
java·spring boot·后端
chenxu98b2 小时前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
sunwenjian8862 小时前
跨域问题解释及前后端解决方案(SpringBoot)
spring boot·后端·okhttp