Open wingmeng opened 5 years ago
在上一期(第 68 期(技巧):git 时光机(一))我们知道可以通过 git reset --hard 命令来将文件回滚到特定版本。我们当时是想将文件回滚到“第3关掉宝前存档”,然而,我们不小心搞错了版本,将文件回滚到了“第1关BOSS门口存档”:
git reset --hard
git reset --hard 98810
这时用 git log 命令会发现后面的三次提交记录都没了:
git log
commit 98810af8ef54c37e1216367be0e00a98acc93f28 Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:42:21 2019 +0800 第1关BOSS门口存档
不用慌,此时可以使用 git reflog 命令来救场,它可以查看所有操作记录(包括已经被删除的 commit 记录和 reset 的操作):
git reflog
98810af HEAD@{0}: reset: moving to 98810 f9432bb HEAD@{1}: commit: 第4关十字路口 9ced26a HEAD@{2}: commit: 第3关掉宝前存档 0ad9871 HEAD@{3}: commit: 第2关打精英怪前存档 98810af HEAD@{4}: commit (initial): 第1关BOSS门口存档
有了这些记录,我们就可以方便的穿越到误操作之前了。然而,糟糕的是,在我们上一次误操作之后,又新提交了一个 commit:
git add game.md git commit -m "最终关存档"
这时该如何恢复之前的三次提交记录,又保留最后一次的提交呢?
$ git reflog de04aa8 HEAD@{0}: commit: 最终关存档 98810af HEAD@{1}: reset: moving to 98810 f9432bb HEAD@{2}: commit: 第4关十字路口 9ced26a HEAD@{3}: commit: 第3关掉宝前存档 0ad9871 HEAD@{4}: commit: 第2关打精英怪前存档 98810af HEAD@{5}: commit (initial): 第1关BOSS门口存档
$ git reset --hard f9432bb # 回滚到误操作之前的版本
此时使用 git log 可以看到之前删除的记录又回来了:
commit f9432bb61e19dea0009a8285ece0ff4a7ba1a73f Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:43:19 2019 +0800 第4关十字路口 commit 9ced26a67204d0b4e4661dd1d0e824a9acd13da5 Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:42:53 2019 +0800 第3关掉宝前存档 commit 0ad987132739a525125bd987c0a7c931db6317de Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:42:38 2019 +0800 第2关打精英怪前存档 commit 98810af8ef54c37e1216367be0e00a98acc93f28 Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:42:21 2019 +0800 第1关BOSS门口存档
好的,之前的三次提交记录是回来了,但最后一次新的提交“最终关存档”没了,如何加上来呢?这时候就要用到“摘樱桃”了:
git cherry-pick de04aa8
运行后,“最终关存档”就回来了,此时文件里可能会有一些冲突,需要打开文件手动处理,处理好后,再提交一次:
最终的结果如下:
$ git log commit a0a06ce10c9b1706201870cf1dd0a3352131fe9f Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 18:22:36 2019 +0800 最终关存档 commit f9432bb61e19dea0009a8285ece0ff4a7ba1a73f Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:43:19 2019 +0800 第4关十字路口 commit 9ced26a67204d0b4e4661dd1d0e824a9acd13da5 Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:42:53 2019 +0800 第3关掉宝前存档 commit 0ad987132739a525125bd987c0a7c931db6317de Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:42:38 2019 +0800 第2关打精英怪前存档 commit 98810af8ef54c37e1216367be0e00a98acc93f28 Author: wingmeng <wingmeng@qq.com> Date: Wed Jul 24 17:42:21 2019 +0800 第1关BOSS门口存档
在上一期(第 68 期(技巧):git 时光机(一))我们知道可以通过
git reset --hard
命令来将文件回滚到特定版本。我们当时是想将文件回滚到“第3关掉宝前存档”,然而,我们不小心搞错了版本,将文件回滚到了“第1关BOSS门口存档”:这时用
git log
命令会发现后面的三次提交记录都没了:不用慌,此时可以使用
git reflog
命令来救场,它可以查看所有操作记录(包括已经被删除的 commit 记录和 reset 的操作):有了这些记录,我们就可以方便的穿越到误操作之前了。然而,糟糕的是,在我们上一次误操作之后,又新提交了一个 commit:
这时该如何恢复之前的三次提交记录,又保留最后一次的提交呢?
此时使用
git log
可以看到之前删除的记录又回来了:好的,之前的三次提交记录是回来了,但最后一次新的提交“最终关存档”没了,如何加上来呢?这时候就要用到“摘樱桃”了:
运行后,“最终关存档”就回来了,此时文件里可能会有一些冲突,需要打开文件手动处理,处理好后,再提交一次:
最终的结果如下: