Git专题:单独回滚代码:记录不变只回滚代码

20.1 构造实验环境

我们在使用 git revert 命令之前,先来构建一个实验环境,用来体现此命令的价值所在,首先我们进入 Git 仓库中,然后去修改一个文件,并通过git status命令展示 Git 的文件状态,参考命令如下:

echo '场景复现' >> index.php && git status

命令执行完毕之后,Git 返回的文件状态信息如下图所示:
图片描述
在上图中可以看到文件index.php已经被修改,接下来我们将修改的内容通过 git commit 提交到版本控制器中去,参考命令如下:

git commit . -m '回滚代码不回滚记录测试'

命令执行完毕之后,Git 返回的提示信息如下图所示:
图片描述
在图中可以看到一个文件被修改,增加了一行代码的提示,说明已经提交成功,接着我们将提交的版本推送到远程仓库中去,参考命令如下:

git push

命令执行完毕之后,远程仓库返回的信息如下图所示:
图片描述
从上图中可以看出,已经成功将版本推送到远程仓库中。

20.2 使用 reset 回滚

假设此时我发现刚才提交的代码有问题,需要撤销这次修改,那么我们可能会使用前面学到的 git reset 命令,但这个命令有些情况下并不适合,下面我将使用 git reset 命令与 git revert 命令进行对比。

首先我们通过 reset 命令将版本恢复到上一个版本,参考命令如下:

git reset HEAD^

命令执行完毕之后,返回的信息如下图所示:
图片描述
在上图中可以看到已经撤销版本成功,文件 index.php 的变更已经在工作区中,接着我们尝试将老版本再次推送到远程,参考命令如下所示:

git push

命令执行完毕之后,远程仓库提示拒绝推送,如下图所示:
图片描述
在上图中推送失败,是因为推送的版本比远程仓库版本老,如果要强制推送可以使用 git push -f,但很多时候我们远程仓库是设置了保护分支的,所以加上 -f 参数依然推送不了,所以有些时候并不适合使用git reset命令。

在明确 git reset 方式不合适之后,我们把代码回滚到远程最新的位置,参考命令如下:

git reset --hard origin/master

命令执行完毕之后,返回的信息如下图所示:
图片描述
在上图中可以看出,Git 代码已经恢复到最新的版本,为了严谨的实验环境我需要再次通过 git log 来确认版本记录,参考命令如下:

git log

命令执行完毕之后,返回的版本记录列表如下图所示:
图片描述
在图中可以看到我们之前构造的实验环境已经恢复完成,同时我们选择任意一个版本将它的 commitid 复制下来,用于我们后面的 git revert 实验。

20.3 revert操作

revert 可以回滚指定的版本的代码,回滚代码后会生成一个新的版本号,记录下整个版本变动流程,就可以用 revert 这种操作方法,下面我们使用 revert 回滚,参考命令如下所示:

git revert 6d8feb147973711d08211f953f3d7c463ee1e88f

命令执行之后,会弹出一个合并代码的提示框,如下图所示:
图片描述
在图中需要我们编辑一些备注信息,编辑好之后,按键盘的 esc 键,然后输入 :x 再按下回车即可。操作完成之后,我们可以通过 git log 命令来查看版本记录的变化,参考命令如下所示:

git log

命令执行完毕之后,返回的版本列表信息如下图所示:
图片描述
在上图中显示了版本记录,可以看到最新的版本记录已经发生了变化,备注信息中提示了是从 revert 中恢复来的,并展示了原始的 commitid,说明我已经操作成功。

接着我们通过 git diff 命令来与我们之前提交的版本区别,用来验证我们的代码效果,构造的命令如下所示:

git diff 6d8feb147973711d08211f953f3d7c463ee1e88f

命令执行完毕之后,返回的版本差异信息如下图所示:
图片描述
在差异信息中,我们可以看到当前最新版本,比此前提交的版本少了一行代码,而这个代码正是我们在前面提交的,说明我们通过 revert 命令撤销版本成功,接着我们尝试将新版本推送到远程,参考命令如下:

git push 

命令执行完毕之后,返回的信息如下图所示:
图片描述
在返回的信息中,可以看出已经成功的提交了代码,并没有出现此前使用 git reset 恢复后推送远程仓库提示当前仓库落后于远程仓库。

需要注意的是,在使用 revert 去恢复某个版本代码时,Git 只会撤销指定版本的代码,而不是指定版本后的所有版本。比如说你提交了 1、2、3 三个版本,当你撤销版本 2 的时候,会生成版本 4,但是不会对版本 3 产生影响。

20.4 小结

在这一节中,主要学习了如何只撤销代码而不撤销版本记录,在文章当中用了 git reset 和 git revert 作对比演示,需要大致记住的几点有:

  1. git reset 命令会改变之前的版本记录,可能会导致不能提交到远程仓库;
  2. git revert命令只会撤销某个版本的代码,然后在当前分支增加一条版本新记录;
  3. git revert 只会撤销指定版本的代码,而不是指定版本后的所有版本。
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定;更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值