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

参考资料

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

相关推荐
FF2501_940228581 小时前
Grid 构建月历网格:7 列模板 + 日期占位算法
后端·华为·harmonyos·鸿蒙系统
神奇小汤圆1 小时前
线程池的 DiscardPolicy 为什么是「静默杀手」?一个生产事故的完整复盘
后端
大鸡腿同学1 小时前
个人博主 AI 剪辑实操:口播视频 3 步出片,省 80% 剪辑时间
后端
其美杰布-富贵-李1 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
xianjixiance_2 小时前
HarmonyOS应用开发实战:萌宠日记 - 整体架构设计与技术选型解析
后端
掘金者阿豪2 小时前
数据库优化器到底在想什么:一个SQL今天能跑明天崩的背后
后端
b130538100492 小时前
HarmonyOS应用开发实战:萌宠日记 - 回调函数模式
后端
Conan在掘金2 小时前
鸿蒙报错速查:Cannot find name 'image',忘 import 编译就炸,根因 + 真解法
后端
雪隐2 小时前
个人电脑玩AI-13让5060 Ti给你打工——我用 0.9B 小模型终结了"谁来记会议纪要"这个世纪难题
前端·人工智能·后端
无名之辈J2 小时前
Ai开发
后端