1 前言

本系列之所以取名”Git高级教程”,主要是教大家解决实际工作中遇到的问题,要求读者会基本的Git用法和命令,请不要使用SourceTree这样的工具,因为它让你啥都不会、啥也不懂,git本身与Linux一脉相承,都是Linus torvalds写的嘛,所以命令行才是精髓。如果你还不会Git的话,强烈建议你学习廖雪峰的教程,简单易懂:

廖雪峰的Git教程

博主也是从这儿入门的,既然有这么好的教程,为什么还要写这个系列的博客呢?很简单嘛,这个教程只是入门教程,解决实际工作中遇到的问题还是不够的,所以博主专门写Git高级教程,记录如何解决实际工作中的问题。

2 简介

先提一个问题,如果线上版本遇到bug,老板要求紧急修复这个bug,然后马上发版本,可是这个时候我们的代码新功能已经开发了到一半了,不能回退,怎么办呢?

用过SVN的童鞋都知道,当一个版本发布后,就要拉一个分支做备份,这样以后线上版本出现紧急bug就可以直接在分支上修复后,发版本,然后合并分支到主干上。

现在我们使用Git进行版本管理的时候,则只需要打一个标签就行啦。

3 Git与SVN区别

Git和SVN正好相反,git提倡开发时拉分支,各干各的,相互独立,发版本时打标签;而svn呢,平时大家都在主干上干活,发版本时拉个分支,所以呢,svn经常会提交冲突,经常要合并代码,只能先把自己的代码备份,然后下载别人的,再合并。Git只需要合并一次就行了。

为啥会这样呢?因为SVN拉分支真的就是在磁盘上复制一份代码,速度自然是很慢的啦,所以大家都不喜欢拉分支,只有发版本时拉一下。而git呢,拉一个分支其实只不过是增加了一根指针而已,所以很快,发版本时打个标签,其实只是取个别名而已,同样很快。

本文就讲述如何通过标签来修复紧急bug。

4 环境搭建

我们先来模拟开发中遇到的情况,博主演示用的目录是 e:\learngit
(1) 首先在e盘下建一个文件夹learngit, 然后打开GitBash,进入e:\learngit目录,并初始化:

cd "e:\learngit"
git init

使用下面的命令,来设置你的用户名和邮箱,这里的用户名和邮箱一般是你的github账号:

git config user.name "xxxx"
git config user.email "xxx@xxx"

(2) 在leangit下新建一个文件a.txt,然后写

第一次发版本

用下面的命令来提交:

git add a.txt
git commit -m "第一次发版本"

提交完毕,可以使用下面的命令来查看提交的记录:

git log

(2) 打标签,发布版本之后就要打标签了,命令如下:

git tag -a v1.0 -m "v1.0版本发布"

然后查看所有标签用下面命令:

git tag 

你也可以查看某个标签的详情:

git show v1.0

上面是打标签的时候写的备注,下面是标签记录的那次提交的备注,其实标签只是对某一次提交记录起了一个别名而已,不要以为通过标签一下次就能拉取代码。

(3) 在a.txt中增加一行”第二次发布版本”,然后用

git add a.txt
git commit -m "第二次发布版本" 

命令提交,但是不需要打标签。

(4) 在a.txt中再增加一行”第三次发布版本”,然后用

git add a.txt
git commit -m "第三次发布版本" 

命令提交,也不需要打标签,这样我们就模拟了在第一次发布版本,打完标签后,我们向前继续开发的过程,a.txt内容如下:

第一次发版本
第二次发版本
第三次发版本

git log命令查看,如下图:

(5) 到此我们就模拟完成了,这个时候第一次发的版本有个bug,要紧急修复,下面我们来完成这个需求

5 通过标签恢复代码

(1) 查看标签的详情,找出打标签的那次提交的commit id

git tag
git show v1.0

commit id这么长记不住怎么办呢?别担心,我们只需要记住前面几位就可以了,这里我们只取前6位:7441b8。Git会根据前面几位自动识别的,当然,你的commit id跟我的肯定是不一样的。

(2) 版本回退
下面我们就通过commit id回到发版本时候的代码去喽:

git reset --hard 7441b8

注意把7441b8换成你的commid id。回退完毕,再看a.txt:

第一次发版本

如果有乱码的话,改成以UTF-8无BOM格式编码。看到没,我们又回到了第一次发版本时候的代码,是不是有点小激动啊.

如果这个时候你立马投入与bug的战斗,修改后发版本,那么你就犯了严重的错误,因为你修改后的代码是无法与正在开发的版本合并哒,也就是说你的修改并不能加入现有的代码。所以:

特别注意:通过标签回退版本后,要马上拉一个分支,然后当前主干分支要立即回到原来的位置,否则正在开发的代码可能白干了,接着在刚拉的分支上修改bug,修改完毕合并到主干上

(3) 拉取分支

回退版本后,立即拉取分支,这里取名bugfix分支:

git checkout -b bugfix

如图所示,我们已经在bugfix分支上了:

查看所有分支请用命令:

git branch

(4) 主干分支立即回到原来的位置

首先,请先回到主干分支上:

git checkout master

回退版本需要commit id,向前进呢,同样也是的。还记得我在第三次提交完毕后,用git log命令查看提交记录吗,现在我们需要第三次提交的commit id,再用git log命令:

可以看到只有第一次的提交记录了,因为这个时候版本回退了git log是查不到第三次提交记录的,怎么办呢,怎么才能回去呢?
别急,这个时候,我们用下面这个命令:

git reflog

看到了吗,你所有的操作记录都在这儿,这就是git,记录操作。可以看到第三次的commit id是 7358a51。回去喽:

git reset --hard 7358a51

再看a.txt:

第一次发版本
第二次发版本
第三次发版本

回到最新的版本啦

(5) 切换到bugfix分支,修改bug

git checkout bugfix

这时a.txt只有一行文字,因为我们的bugfix分支是回退版本到第一次提交时拉取的分支,接着我们加一行”修复第一次发版本的紧急bug”:

第一次发版本
修复第一次发版本的紧急bug

接着用命令

git add a.txt
git commit -m "修复第一次发版本的紧急bug"
git tag v2.0 

提交这次修改,修改完毕,再打个标签,一般标签的版本要升一级,这样下次再出bug了,就直接从这儿改起,也就可以在合并后直接删除bugfix分支了

(6) 合并到主干上

在bugfix分支上修复了紧急bug之后,就可以发一个新的版本,之后就要把修复后的代码合并到我们的主干上,不然下次发版本这个bug还是存在的。合并用下面的命令:

git checkout master //先切换到主干上
git merge bugfix    //再合并修改bug的分支

这个时候,你可以在心里默念,神兽保佑,没有冲突。然而这并没有什么卵用,你念或不念,冲突就在那里,不多不少。这个时候可以用git status 命令查看谁发生了冲突:

从上图可以看到两个分支都修改了a.txt,这个时候再来看a.txt:

第一次发版本
<<<<<<< HEAD
第二次发版本
第三次发版本
=======
修复第一次发版本的紧急bug
>>>>>>> bugfix

其中<<<<<<Head======这个是当前分支,也就是master分支的内容,从======>>>>>>>bugfix,是bugfix分支的内容
修改冲突很简单啦,把多余的内容去掉就可以了

第一次发版本
修复第一次发版本的紧急bug
第二次发版本
第三次发版本

提交代码就解决冲突了

(7) 推送标签到远程

在实际开发中我们都是关联了远程仓库的,在提交完代码后我们一般用git push将代码推送到远程仓库中,但是git push命令是不会推送标签的,这点一定要注意

标签必须手动推送到远程仓库

可以用下面的命令一次推送所有标签到远程:

git push origin --tags 

(8) 好了,到这里我们就完成了通过标签修复线上版本的紧急bug,这个时候你就可以删掉本地分支bugfix了,但是不建议你这么做,搞不好线上又出个bug,你就可以直接接着改啦,反正是在本地的分支。

6 总结

总结一下,通过标签修改bug的步骤如下:

  1. 主分支回退到打标签的那次提交
  2. 拉取分支bugfix
  3. 主分支立即回到最新状态
  4. 切换到bugfix分支,修改bug,发版本,打新标签
  5. 合并bugfix分支到主干上
  6. 手动推送标签到远程

7 转载请注明来自“梧桐那时雨”的博客:http://blog.csdn.net/fuchaosz/article/details/51698896

Tips
如果觉得这篇博客对你有帮助或者喜欢博主的写作风格,就给博主留个言或者顶一下呗,鼓励博主创作出更多优质博客,Thank you.

[Git高级教程 (一)] 通过Tag标签回退版本修复bug相关推荐

  1. [Git高级教程 (一)] 通过 Tag 标签回退版本修复 bug

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1 前言 本系列之所以取名"Git高级教程",主要是教大家解决实际工作中遇到的问 ...

  2. [Git高级教程(二)] 远程仓库版本回退方法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 ...

  3. Wordpress建站教程:优化Tag标签地址

    作者:悦然wordpress建站(悦然建站) 继续分享wordpress建站教程,今天来讲讲tag标签地址优化.我们之前的教程给大家讲过使用用好wordpress的tag标签功能,但是那篇教程遗漏了一 ...

  4. git中使用tag打标签管理版本

    在现在的项目中,版本管理混乱,初步通过把git标签来追述代码. 1.查看现有的taggit tag //显示所有的版本信息,如果为空就代表你没有此时没有任何版本信息例如:$ git tag -l -n ...

  5. git常用命令(克隆、分支、tag标签、推送、日志查看,常用命令总结)、将本地代码第一次提交到远程git仓库、过滤掉不提交的内容

    1.1 克隆Git代码 $ git clone http://xxxx.git --branch master 为自己的写新项目添加git版本控制,进入项目目录执行以下命令: git init . 2 ...

  6. 万字详解Git入门教程!

    作者 | gafish 编辑 | 高效程序员 前言 Git简介 实用主义 深入探索 总结 参考资料 前言 Git 是程序员学习和工作都离不开发工具,也是非程序员好用的文档版本管理工具,今天给大家带来了 ...

  7. Git 入门教程,10000 字详解

    前言 Git简介 实用主义 深入探索 总结 参考资料 Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人 ...

  8. 保姆级Git入门教程,万字详解

    作者 | gafish 编辑 | 高效程序员 前言 Git简介 实用主义 深入探索 总结 参考资料 前言 大家好,我是 SAM. Git 是程序员学习和工作都离不开发工具,也是非程序员好用的文档版本管 ...

  9. 保姆级 Git 入门教程,10000 字详解

    转载来自:杰哥的IT之旅 前言 Git简介 实用主义 深入探索 总结 参考资料 Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目 ...

最新文章

  1. Python Qt GUI设计:QLabel标签类(基础篇—11)
  2. spring el表达式 if else_vue指令集合:v-for,v-show,v-if等
  3. Linux 解决ssh连接慢的问题
  4. java 23种设计模式(转载)
  5. ai的预览模式切换_深耕基础办公领域,永中软件云端远程办公新模式助力企业复工复产...
  6. sql中添加唯一索引(非主键)
  7. 软件开发工程师:程序员的职业规划就像软件工程
  8. 仓库无证如何处罚_法律问题 | 在船舶检查过程中,我遇到的一些问题该如何解决?...
  9. python ddos_python 检查是否存在ddos攻击
  10. NetSetMan v5.0.5特别版
  11. 什么是DMZ区域,DMZ区域的作用与原理
  12. phpMyAdmin下载、安装和使用入门教程
  13. 死锁、CPU飙高、内存泄漏、内存溢出、栈溢出 问题定位及解决方法汇总
  14. Springboot官网学习(5、深入Springboot之SpringApplication【五自定义横幅】)
  15. Exoplayer简介
  16. 程序员做外包,真的没地位没出路吗
  17. office修复找不到msi_windows7系统下打开office提示缺少pro11msi如何解决
  18. vue实现鼠标移入移出事件
  19. bazel 的安装与卸载
  20. JVM学习笔记(二):垃圾回收、垃圾回收算法、垃圾回收器(Serial、Parallel、CMC、G1)、内存分配原则实战

热门文章

  1. android wear gear2,开发大神实现三星Gear 2上启动Android Wear
  2. ssh-keygen生成公钥及可能遇到的问题
  3. MYSQL按月对收款金额进行统计
  4. php匹配车牌号,PHP脚本自动识别验证码查询汽车违章
  5. JSON 数据格式(详细讲解)
  6. 图片去水印神器,一秒去水印
  7. uniapp下载文件
  8. 弈剑特点,极限攻击和极限防御以及控制抵抗
  9. 刷脸支付补贴来了!支付宝取消30亿限额,补贴无上限
  10. 《30天吃掉那只 TensorFlow2.0》 1-4 时间序列数据建模流程范例 (国内新冠疫情结束时间预测问题)