Git之后悔药💊

  说到Git,大家一定耳熟能详,关于Git的基本概念等在这里就不多赘述了。Git强大的撤销、版本回退功能,让我们在开发的过程中能够随意并快捷的回到任何一个时间点的状态,本文我们就来看看Git中的各种后悔药

 

  • 工作区的代码怎么高效撤销更改呢?

  • 已经提交到暂存区,还没有提交到本地仓库的代码,如何高效撤销更改呢?

  • 已经提交到本地仓库,还没有推送到远程仓库的代码,怎么高效撤销更改呢?

  • 已经推送到自己的远程分支的代码,如何进行高效的撤销更改呢?

  • 已经推送到远程公共分支并且被别人拉取过的代码,如何进行高效的撤销更改呢?

 

  下面我们就结合例子一一解决这些问题!

 

  场景一:

  小王来了一个紧急需求,写了一会发现需求理解有误,代码写错了,想回到一开始的状态,有个笨方法就是把刚才写的代码一行一行删掉,不过这种方法成本太高效率太低。Git为我们提供了 git checkout -- <filename> 撤销工作区的修改。

  

  可以理解为 git checkout 复方草本“撤销”颗粒就是将图中工作区index.css的修改删除了。

 

  场景二:

  小王手速快,已经将代码add到暂存区了,不用担心,也能撤销,Git为我们提供了 git reset HEAD 撤销暂存区的修改。

  

  可以理解为 git reset HEAD 同仁堂牌“撤销”口服液就是将图中暂存区index.css的修改退回到工作区了。

 

   场景三:

  小王手一滑已经将代码提交到本地仓库了,这时候想要回退该怎么办呢?别怕,刚才的后悔药照样好使。git reset 后悔药有好几个系列呢,有小王刚刚用的git reset HEAD,还有git reset HEAD^、git reset HEAD^^、git reset HEAD~n、git reset commitId等。

     注意:加上--hard标记后会告诉git要重置缓存区和工作目录的更改,就是说:先将你的暂存区清除掉,然后将你所有未暂存的更改全部清除掉,所以在使用前确定你想放弃所有的本地修改。

  • git reset HEAD^:回到上一个版本

  • git reset HEAD^^:回到上上个版本

  • git reset HEAD~n:n表示回退n个版本

  • git reset commitId:回到具体的某个commitId 版本(git log可以查看每次提交生成的唯一id)

 

  可以理解为 git reset 速效“撤销”丸是针对图中本地仓库的回退操作,可以将本地仓库中的文件快速方便的回到任何一次提交时间点的状态。

 

  场景四:

  如果小王的修改已经提交到了他自己的远程分支,想撤销就需要回滚远程分支了。

  第一步要回退本地分支,用刚才提到的git reset 速效“撤销”丸回退,这时本地分支已经回退完成。

  第二步,将本地分支强制推送到远程,回滚完成。

  注意:本地分支回滚后,版本将落后于远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支。

 

  场景五:

   小王的修改已经推送到了自己的远程分支,并且被master分支merge过了,同事小李又基于master切出了新分支进行开发,这时小王突然发现有部分代码有问题,需要回滚,这时就比较棘手了,如果你擅自回滚了远程仓库,会对项目团队其他人造成不可预知的影响,所以回滚需谨慎。

   回滚远程分支,可以使用 git reset 和 git revert 两个命令,这两个后悔药的区别是什么呢?什么时候该吃哪个后悔药呢?

  

  • revert是放弃指定提交的修改,但是会生成一次新的提交,会生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留,以前的历史记录都在;

  • reset是穿越时空指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。

 

  针对上面小王的情况,考虑到其他人的版本历史,是不建议使用 git reset 的,此时应该使用git revert 命令,因为不会修改之前的提交历史,相当于对数据做了一次逆操作,然后再执行add,commit等命令。

 

  • 对于和其他人协同的项目,一般用git revert比较好。git revert不会丢掉别人的提交,即使你回退后覆盖了别人的提交,他更新代码后,可以在本地用 git reset 向前回滚,找到自己的代码,然后拉一下分支,再合并上去就可以找回被你覆盖的提交了。

  • 如要要保持版本历史干净的话,建议还是用 git reset;希望保留完整的历史的话,使用git revert为好。

 

  看完以上几种情况,如果对Git的回退撤销还是不太清楚,下面奉上这张走心手绘版流程图,希望可以帮助大家理解记忆。

  

  

  总结:

  人生没有后悔药,但git有啊。

  掌握了以上几种场景的版本回退方式,就可以高效的回滚代码了,毕竟对于程序员来说效率很重要。希望本文可以帮助大家更好地了解Git回退,如有错误,欢迎大神批评指正。

 

 

posted @ 2018-09-21 15:04  fairy~  阅读(249)  评论(0编辑  收藏  举报