1 误用git reset --hard,我真的没救了吗? —— 认识一下 git reflog 时光穿梭机

  • 我们直奔主题,先看下面的问题:

  懵懂的小白花费一周时间做了 git log 如下所示的 6 个功能,每个功能对应一个 commit 的提交,分别是 feature-1 到 feature-6”:
4 git reset --hard - 图1然后错误的执行了强制回滚,git reset --hard 2216d4e,回滚到了 feature-1 上,并且回滚的时候加了—hard,导致之前 feature-2 到 feature-6 的所有代码全部弄丢了,现在 git log 上显示如下:
4 git reset --hard - 图2然后,又在此基础上新添加了一个 commit 提交,信息叫 feature-7:
4 git reset --hard - 图3
  请问:如何把丢失的代码 feature-2 到 feature-6 全部恢复回来,并且 feature-7 的代码也要保留

  • 接下来,我们回忆几个 git 命令:
    • git reset --hard撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交,谨慎使用 –hard 参数,它会删除回退点之前的所有信息;
    • git log 命令可以显示所有提交过的版本信息;
    • git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作);
    • git cherry-pick命令的作用,就是将指定的提交(commit)应用于其他分支。
  • 最后,给出解答:git refloggit cherry-pick
    • 首先,使用 git reflog 查看所以 git 操作记录,记下 feature-7 和 feature-6 的 hash 码。
  • 4 git reset --hard - 图4
    • 其次,git reset --hard cd52afc回滚到 feature-6。此时我们已经完成了要求的一半:成功回到了 feature-6 上,但是 feature-7 没了。
    • 最后,git cherry-pick 4c97ff3,执行完成之后,feature-7 的代码就回来了,大功告成。