git 版本回退
情景
周末兴冲冲的写完了祭祖实验一,到作业平台上去准备提交。随便点开面向对象的软件构造导论的实验看看提交情况,却发现实验三没有上次提交的时间。
这不对吧,是谁没交作业啊?.jpg
感到疑惑的我去问了助教,得到了令人悲伤的回复——真的没交。
但我的项目都写到实验四了,这可怎么办?一点一点改回去吗?
当然不是,还好我在开始的时候就为我的项目准备好了版本管理工具——Git。
git log 查看 commit 记录
git log
命令显示从最近到最远的提交日志。
养成了良好的提交更改的习惯之后,看之前的 commit 描述就很清楚的知道每一次记录大致做了什么。
如果是都是自己提交的记录,不需要注意作者,或是不太在意时间,只关注 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
可以看到版本回退成功了,HEAD 也指向了这次 commit。
(随时使用 git log 查看版本信息是好习惯,就像在提交更改时需要常看 git status 一样。)
打开项目看一看——果然是实验三过时的代码,还是赶紧和报告一起打包提交。
返回到最新版本
交完作业终于安心了。可是该如何回到上面的版本呢?如上面的 git log 所示,"exp3 absenemy forward fix"的 commit 之后的 commit 都看不到了。
这就有点麻烦了,因为我已经把 git bash 关掉了,找不到之前用 git log 时看到的最新的 commit 的 commit id 了。
还好 Git 提供了一个命令git reflog
用来记录你的每一次命令:
git reflog
OK 了,找到了最新的记录。那么就再来一次 git reset --hard
就可以了。
后记
感觉这次小科普(x)的成本有点高啊(
大致是把廖雪峰的教程复习了一遍,所以这篇文章很水,但是我的实际经历,所以这个知识点是不会忘记了(笑)。
1 条评论
Very Helpful!