GIT系列之时光倒流,老板再也不用担心代码丢失了

186 阅读3分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

时光倒流(版本回退)

我想大部分同学使用git的最初的动力就是因为这个功能吧。

现在我们对readme文件进行修改,再随便添加些东西,然后readme内容就变成下面这样

hello git
hello git 2.0

然后再次add commit。

现在我们的仓库里有两个版本了,我们可以用下面的命令查看git的提交历史

git log

显示结果

commit b5934a2d9f80d257ca50b9b80a4b31d5bb9fe03c
Author: = <woody@gmail.com>
Date:   Sun Jan 22 16:27:59 2017 +0800

    第二次提交

commit 3eb5f7721cb86c617faf0d2ad13a5cee9d1a3764
Author: = <woody@gmail.com>
Date:   Sun Jan 22 16:16:10 2017 +0800

创建readme.txt文件

注意:commit字段是自动生成的,所以你的结果一定与我的不一样,以你的为准

好了,下面下面我们将readme.txt回退到最开始创建的状态。git使用HEAD表示当前的版本,就是最新的版本。 上一个版本是HEAD^,再上一个版本是HEAD^^,上一百个版本是HEAD~100(当然你也可以打100个^)。 使用下面的命令回退到指定版本

git reset --hard HEAD^
HEAD is now at 3eb5f77 创建readme.txt文件

看看内容改了没有。 现在我们再查看下log,结果如下:

commit 3eb5f7721cb86c617faf0d2ad13a5cee9d1a3764
Author: = <coder.0012ff7c@gmail.com>
Date:   Sun Jan 22 16:16:10 2017 +0800

    创建readme.txt文件

好了,时光倒流成功!但是悲哀的发现我们回不到未来了。还是有办法的,--hard 参数支持commit值。 就是说你可以在--hard后面跟一个commit值,就能跳到那个版本。 执行下面的代码

git reset --hard b5934a
HEAD is now at b5934a2 第二次提交

不用将所有的字符都写上,只要能区分出不同就好,git会自动去匹配

但是万一找不到commit值呢,没关系。使用下面的命令可以查看所有的历史

git reflog

显示结果:

b5934a2 HEAD@{0}: reset: moving to b5934a
3eb5f77 HEAD@{1}: reset: moving to HEAD^
b5934a2 HEAD@{2}: commit: 第二次提交
3eb5f77 HEAD@{3}: commit (initial): 创建readme.txt文件

最前面那串字符就是。好了。搞定!

时光倒流(revert方式)

这种操作存在一个问题,服务器上的代码虽然被还原了,但假如有多个人在使用,他们本地的版本依然是比服务器上的版本高的,所以,别人再重新提交代码的话,你撤销的操作又会被重新,你上面的操作也就白操作了。解决办法是,让别人把本地的分支先删掉,然后重新从服务器上拉取分支。

这个时候我们就可以使用 revert 方式来回滚。这种方式不会把版本往前回退,而是生成一个新的版本。所以,你只需要让别人更新一下代码就可以了,你之前操作的提交记录也会被保留下来。

首先找到你需要回滚的版本号。然后执行以下命令:

git revert -n 版本号
git commit -m xxxx 提交
git push 推送到远程

这样就可以了,其他人可以获取到当前版本的代码了