背景
在日常开发时,偶尔会出现不小心“丢失”某个 commit 的情况,那么此时是否还有办法补救呢?本文会探讨这个问题。
要点
- 用 命令可以找到近期的
commit的简要信息 - 在此基础上执行 命令就可以找回对应的
commit(请注意, 是有风险的操作,操作前注意备份当前代码)
正文
为了便于讨论,我们来杜撰一个例子 ⬇️
示例
准备工作
请将以下代码保存为 main.sh (具体的名称并不重要)
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 main.sh
我们通过 cd temp 切换到 temp 子目录中,使用如下命令就可以看到各个 commit 的简要信息 ⬇️
git log --pretty=oneline
在我的电脑上,看到的结果如下(在您的电脑上,各个 commit 的 hash 值应该会是其他值)
42f48ebfc8bd80f2100f00ddf827b1700098e70d (HEAD -> main) 3rd commit for 柳宗元 江雪
5a8359bcb69c707878e73f48b5a1febc15c62a8b 2nd commit for 孟浩然 春曉
bc5628e51aa18cfe54d9dd1036d490b2ee7a81fd 1st commit for 李商隱 樂遊原
借助 IntelliJ IDEA (Community Edition) 看到的效果如下 ⬇️
模拟 commit 丢失的场景
现在我们来模拟某些 commit 丢失的场景。在 temp 子目录内,通过执行以下命令,我们可以让 main 分支回到第一个 commit
git reset --hard HEAD~2
IntelliJ IDEA (Community Edition) 看到的最新效果如下 ⬇️
看来最新的两个 commit 都被弄丢了 😱 我们成功模拟了 commit 丢失的场景。
恢复
此时应该如何恢复丢失的那两个 commit 呢?我们可以借助下方的命令。
git reflog
执行这个命令后,我看到的结果如下 (在您的电脑上,各个 commit 的 hash 值可能会是其他值)
其中红框里的那个 commit 就是我们想退回的地方。保险起见,我们先把当前分支做个备份 ⬇️
git checkout -b main_backup
git checkout main
然后再执行如下命令就可以让 main 分支回到过去的位置了 (请注意:在您的电脑上,最新的那个 commit 很可能是是其他值,所以不能直接复制下方的命令)
git reset --hard 42f48eb
执行完命令后,在 IntelliJ IDEA (Community Edition) 检查一下 ⬇️ 结果符合预期
参考资料
以下两个链接来自同一个网站,只是语言不同,第一个链接的内容是简体中文,第二个链接的内容是英语