fezaoduke / fe-practice-hard

晚练课
69 stars 6 forks source link

第 69 期(技巧):git 时光机(二) #72

Open wingmeng opened 5 years ago

wingmeng commented 5 years ago

在上一期(第 68 期(技巧):git 时光机(一))我们知道可以通过 git reset --hard 命令来将文件回滚到特定版本。我们当时是想将文件回滚到“第3关掉宝前存档”,然而,我们不小心搞错了版本,将文件回滚到了“第1关BOSS门口存档”:

git reset --hard 98810

这时用 git log 命令会发现后面的三次提交记录都没了:

commit 98810af8ef54c37e1216367be0e00a98acc93f28
Author: wingmeng <wingmeng@qq.com>
Date:   Wed Jul 24 17:42:21 2019 +0800

    第1关BOSS门口存档

不用慌,此时可以使用 git reflog 命令来救场,它可以查看所有操作记录(包括已经被删除的 commit 记录和 reset 的操作):

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 add game.md
git commit -m "最终关存档"

最终的结果如下:

$ 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门口存档