本文转载自微信公众号《Java极客科技》,作者鸭血范。转载本文请联系Java极客技术公众号。大家好,我是阿芬。之前给大家介绍过一些超级实用的Git命令。没看过的可以看看那些你应该知道,但今天你一定不知道的Gitshow操作。给大家介绍一个不常用,但在关键时刻非常有用的命令gitrevert。背景在日常工作中,很多同事经常一起迭代开发,往往很多需求是在不同的代码分支上开发的。如果不小心提交了未完成的功能并推送到分支,那么我们该怎么办?阿芬最近遇到了这样的问题。之前提交的一个功能代码虽然是一个完整的功能,但是由于种种原因,这个功能已经被取消了,相关的代码也需要撤销,不能再提交了。到生产环境,但在此提交之后还有许多其他功能代码提交。其他功能仍需正常上线,不受影响。这时候很多朋友会说:能不能修改相应的需要撤销的功能码?这个方案在当时是可以的,尤其是我们很多地方没有改动的情况下,直接修改代码就可以修改回去,方便简单快捷。但是如果要修改的文件很多,而且每个文件修改的地方也很多,那就很麻烦了。提前修改一行行修改很浪费时间。当GitReset/Revert遇到这种情况时,我们能想到的是网上一定有相关的解决方案,Git肯定会提供相应的命令来帮助我们。通过查询Git手册,我们发现Git为我们提供了两个相关的版本回滚命令,分别是reset和revert。两者有什么区别?下面,阿粉将通过实例向大家展示这两个命令的用法和区别。对于GitReset,我们先分几次创建几个文件,然后依次commit和push,形成多次提交。如下图所示,我们创建了四个文件,分别对每个文件进行提交和推送,然后通过gitlog命令我们可以查看整个提交的日志信息,其中包含四个文件的提交记录。现在我们突然发现test3.txt文件的提交有问题,需要回滚到test2.txt的版本,我们可以执行命令gitreset--hard15e32cd0cc909ef6791e4417f5572b5e7886f977--hard意思是强制回退到指定的版本,后面是目标的版本号。然后通过gitlog命令可以看到当前版本发生了变化,变成了我们指定的版本。然后我们使用gitpush-foriginbranch命令将重置版本推送到远程服务器。由于我们本地的代码在推送到服务器之前就已经落后于服务器的代码了,所以我们需要加上-f参数来强制推送到远程服务器server。细心的朋友可能会发现我们这里执行后确实回滚到了需要的版本,但是如果问题只是test3.txt文件,test4.txt文件没问题,我们可以正常提交,如果我们这样操作,我们会丢失test4.txt版本的修改。当然我们可以重新提交重新写,但是如果这个版本内容很多,我们就改不了了。因此,我们一般不使用这种方法。我们只有在保证后续的所有修改都不需要的情况下,才能使用这种方法。下面来看看GitRevert的gitrevert命令的用法。我们分两次创建两个文件,分别commit和push到远程,然后通过gitlog可以看到如下内容。现在最新的版本是test6.txt了。同样,这时候我们发现test5.txt的版本有问题,但是test6.txt的版本是正确的,我们只想撤销test5.txt版本的提交。这时候我们执行命令gitrevert-n50896fa7d9ba16b63a0fc539bb6620411e5dee4c撤销test5.txt版本,执行gitcommit-mxxx提交然后push到远程。通过git日志我们可以看到新生成了一个提交取消了我们test5.txt版本的内容,而test6.txt版本的提交还在。通过上面的演示,我们可以发现gitreset和gitrevert这两个命令虽然可以进行版本回滚,但是在使用的时候还是有很多区别的。当我们确认需要回退的版本之后的提交是不必要的时候,我们可以直接使用gitreset命令,但是当我们只是需要撤销某个版本时,我们可以使用gitrevert。总结今天阿芬通过实例介绍了gitreset和gitrevert这两个命令的使用和区别。在日常工作中,难免会遇到用到它的需要。不需要的最好,不过万一需要的时候用到,对大家也很有帮助,如果觉得有用,请点赞转发,让更多的朋友看到??。
