git 版本回退

情景

周末兴冲冲的写完了祭祖实验一,到作业平台上去准备提交。随便点开面向对象的软件构造导论的实验看看提交情况,却发现实验三没有上次提交的时间。

没交作业_1

这不对吧,是谁没交作业啊?.jpg

这不对吧

感到疑惑的我去问了助教,得到了令人悲伤的回复——真的没交。

没交作业_2

但我的项目都写到实验四了,这可怎么办?一点一点改回去吗?

当然不是,还好我在开始的时候就为我的项目准备好了版本管理工具——Git。

logo@2x.png (220×92) (git-scm.com)

git log 查看 commit 记录

git log 命令显示从最近到最远的提交日志。

养成了良好的提交更改的习惯之后,看之前的 commit 描述就很清楚的知道每一次记录大致做了什么。

git_log

如果是都是自己提交的记录,不需要注意作者,或是不太在意时间,只关注 commit 的注释的话,建议使用命令:

git log --pretty=oneline

来简化日志的输出。

可以看到,最新的 commit 描述是"change some name and fix some",而我想找到实验三完成时提交的记录,也就是 commit 描述为"exp3 absenemy forward fix"的 commit。

同时还注意到,当前版本是如何定义的。在Git中,用HEAD表示当前版本,也就是最新的提交。

最后看到前面的一大串数字,这是每一次 commit 的 commit id,就像身份证一样,git 使用 id 来确定 commit 记录。

(PS:git log 输入字母 Q即可退出,当然直接关掉 git bash 也行;加上 --pretty=oneline 后就不用考虑这个问题了。)

git reset --hard 版本回退

回退版本的命令为 git reset --hard

  • 第一种用法:用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,这样加符号额办法是不推荐的。
  • 第二种用法:往上100个版本:写100个^比较容易数不过来,所以写成HEAD~100,然而谁会去数要往上多少个版本呢,这是不现实的。
  • 第三种用法:用 commit id 来跳转。

前面已经用 git log 显示出了所有的 commit id,你需要做的只是复制而已(甚至不用复制完全)。

git reset --hard cc968b8a1af4e5217cc187b8e309f824d4c1288f

git_reset_1

可以看到版本回退成功了,HEAD 也指向了这次 commit。

git_log_2

(随时使用 git log 查看版本信息是好习惯,就像在提交更改时需要常看 git status 一样。)

打开项目看一看——果然是实验三过时的代码,还是赶紧和报告一起打包提交。

实验三提交_安心

返回到最新版本

交完作业终于安心了。可是该如何回到上面的版本呢?如上面的 git log 所示,"exp3 absenemy forward fix"的 commit 之后的 commit 都看不到了。

这就有点麻烦了,因为我已经把 git bash 关掉了,找不到之前用 git log 时看到的最新的 commit 的 commit id 了。

还好 Git 提供了一个命令git reflog用来记录你的每一次命令:

git reflog

git_reflog

OK 了,找到了最新的记录。那么就再来一次 git reset --hard 就可以了。

git_reset_2

后记

感觉这次小科普(x)的成本有点高啊(

成本高_流泪

大致是把廖雪峰的教程复习了一遍,所以这篇文章很水,但是我的实际经历,所以这个知识点是不会忘记了(笑)。

参考

版本回退 - 廖雪峰的官方网站 (liaoxuefeng.com)

最后修改:2022 年 04 月 17 日
如果觉得我的文章对你有用,请随意赞赏