基础命令教程:廖雪峰的Git教程
本文就讲述如何通过标签来修复紧急bug。参考 [Git高级教程 (一)] 通过Tag标签回退版本修复bug
步骤如下:
1.主分支回退到打标签的那次提交
2.拉取分支bugfix
3.主分支立即回到最新状态
4.切换到bugfix分支,修改bug,发版本,打新标签
5.合并bugfix分支到主干上
6.手动推送标签到远程
Git与SVN区别
Git和SVN正好相反,git提倡开发时拉分支,各干各的,相互独立,发版本时打标签;而svn呢,平时大家都在主干上干活,发版本时拉个分支,所以呢,svn经常会提交冲突,经常要合并代码,只能先把自己的代码备份,然后下载别人的,再合并。Git只需要合并一次就行了。
为啥会这样呢?因为SVN拉分支真的就是在磁盘上复制一份代码,速度自然是很慢的啦,所以大家都不喜欢拉分支,只有发版本时拉一下。而git呢,拉一个分支其实只不过是增加了一根指针而已,所以很快,发版本时打个标签,其实只是取个别名而已,同样很快。
序
先提一个问题,如果线上版本遇到bug,老板要求紧急修复这个bug,然后马上发版本,可是这个时候我们的代码新功能已经开发了到一半了,不能回退,怎么办呢?
用过SVN的童鞋都知道,当一个版本发布后,就要拉一个分支做备份,这样以后线上版本出现紧急bug就可以直接在分支上修复后,发版本,然后合并分支到主干上。
现在我们使用Git进行版本管理的时候,则只需要打一个标签就行啦。
模拟
此时master是线上分支,提交记录:
v1.0版本发布 (打过tag,发版)-新功能的N次提交
新功能的N次提交,所以直接回退,不妥当。
先科普下几个命令:
【发版后打tag】
$ git tag 版本名
【查看标签的详情,找出打标签的那次提交的commit id】
$ git tag
$ git show v1.0
然后版本回退到此次提交版本
git reset --hard 7441b8
切记就直接在这改了。
特别注意:通过标签回退版本后,要马上拉一个分支,然后当前主干分支要立即回到原来的位置,否则正在开发的代码可能白干了,然后在这个新拉分支上修复bug,然后合并到主分支,
【基于master拉取新分支】
git checkout -b bugfix
【从bugfix回到master调整HEAD至最新】
$ git checkout master
$ git reflog // 拿到最后一次提交的commitID
$ git reset --hard 最后一次提交的commitID
【切换到bugfix分支>修改bug>提交>合并到master>推送tag到远程】
$ git add .
$ git commit -m "修复第一次发版本的紧急bug"
$ git tag v2.0 //修改完毕,再打个标签,一般标签的版本要升一级,这样下次再出bug了,就直接从这儿改起
$ git checkout master //先切换到主干上
$ git merge bugfix //再合并修改bug的分支,此时冲突必然。
$ git status //这个时候可以用git status 命令查看谁发生了冲突
`
第一次发版本
<<<<<<< HEAD
第二次发版本
第三次发版本
=======
修复第一次发版本的紧急bug
>>>>>>> bugfix
`
其中<<<<<<Head到======这个是当前分支,也就是master分支的内容,从======到>>>>>>>bugfix,是bugfix分支的内容
修改冲突很简单啦,把多余的内容去掉就可以了,然后提交代码就解决冲突了
$ git push origin --tags //git push命令是不会推送标签的,这点一定要注意
好了,到这里我们就完成了通过标签修复线上版本的紧急bug,这个时候你就可以删掉本地分支bugfix了,但是不建议你这么做,搞不好线上又出个bug,你就可以直接接着改啦,反正是在本地的分支。