1 误用git reset --hard
,我真的没救了吗? —— 认识一下 git reflog
时光穿梭机
- 我们直奔主题,先看下面的问题:
懵懂的小白花费一周时间做了 git log 如下所示的 6 个功能,每个功能对应一个 commit 的提交,分别是 feature-1 到 feature-6”:然后错误的执行了强制回滚,
git reset --hard 2216d4e
,回滚到了 feature-1 上,并且回滚的时候加了—hard,导致之前 feature-2 到 feature-6 的所有代码全部弄丢了,现在 git log 上显示如下:然后,又在此基础上新添加了一个 commit 提交,信息叫 feature-7:
请问:如何把丢失的代码 feature-2 到 feature-6 全部恢复回来,并且 feature-7 的代码也要保留
- 接下来,我们回忆几个 git 命令:
git reset --hard
撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交,谨慎使用 –hard 参数,它会删除回退点之前的所有信息;git log
命令可以显示所有提交过的版本信息;git reflog
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作);git cherry-pick
命令的作用,就是将指定的提交(commit)应用于其他分支。
- 最后,给出解答:
git reflog
和git cherry-pick
- 首先,使用
git reflog
查看所以 git 操作记录,记下 feature-7 和 feature-6 的 hash 码。
- 首先,使用
- 其次,
git reset --hard cd52afc
回滚到 feature-6。此时我们已经完成了要求的一半:成功回到了 feature-6 上,但是 feature-7 没了。 - 最后,
git cherry-pick 4c97ff3
,执行完成之后,feature-7 的代码就回来了,大功告成。
- 其次,