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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

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的步骤如下:

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


转自 “梧桐那时雨”的博客:http://blog.csdn.net/fuchaosz/article/details/51698896
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javascript 自定义输出

缘由 前段时间再看了一些javascript的学习资料,也写的一些demo,在输出的时候一般都用alert,但这个方法会打断函数运行,用起来不是很好.还有就是console.log这个方法,这种方法原来一直以为只能在FireFox上面才能用,现在才发现主流浏览器都支持.但我的这个插件已经写的差不多了,所…

不要打2岁内和6岁后的孩子 父母必看

一位妈妈说&#xff1a;“孩子经常无理取闹&#xff0c;到超市就要买这买那&#xff0c;不给买就坐在地上哭闹。到别人家去就乱翻乱动&#xff0c;还会到人家沙发上乱蹦&#xff0c;无论你怎么说&#xff0c;孩子都不听话。每次我都会气不打一处来&#xff0c;回到家就痛打一顿…

设计模式之开放封闭原则

以下皆是个人理解如有不对请留言指出&#xff0c;谢谢&#xff01; 我就代码提出我自己个人的看法&#xff1a; 正常定义一个类例如银行工作员&#xff0c;他可以执行存款&#xff0c;付款和转账功能&#xff0c;如果在现有功能上我想添加贷款功能&#xff0c;需要在类中添加…

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

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

uplift model学习笔记

一、解决的问题&#xff1a; 通常的 Propensity Model 和 Response Model 只是给目标用户打了个分&#xff0c;并没有确保模型的结果可以使得活动的提升最大化&#xff1b;它没有告诉市场营销人员&#xff0c;哪个用户最有可能提升活动响应&#xff1b; 因此&#xff0c;需要另…

必须看透的50个错觉 人生要看透而不看破!

我们应该感谢命运的多喘&#xff0c;是它用历练使一颗脆弱心的渐渐变得坚强&#xff0c;变得对一切都充满了向往。无可否认&#xff0c;只有真正的经历了一些事物之后&#xff0c;你才会对人生看得更加透彻&#xff0c;才会对世间真情感悟的更加真切。 1、个人只能被现实改变…

设计模式之依赖倒置原则

在传统的过程式中&#xff0c;上层依赖于底层&#xff0c;当底层变化&#xff0c;上层也得跟着做出相应的变化。这就是面向过程的思想&#xff0c;弊端就是导致程序的复用性降低并且提高了开发的成本。 而面向对象的开发则很好的解决了这个问题&#xff0c;让用户程序依赖于抽象…

@Transactional 详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Transactional 是声明式事务管理 编程中使用的注解 1 .添加位置 1&#xff09;接口实现类或接口实现方法上&#xff0c;而不是接口类中…

LiveGBS高性能GB28181国标流媒体服务流传输模式支持UDP、TCP被动、TCP主动模式

LiveGBS国标(GB28181)流媒体服务软件&#xff1a; 提供用户管理及Web可视化页面管理&#xff1b; 提供设备状态管理&#xff0c;可实时查看设备是否掉线等信息&#xff1b; 实时流媒体处理&#xff0c;PS&#xff08;TS&#xff09;转ES&#xff1b; 设备状态监测、云台控制、录…

通过人行横道线

学车中的通过人行横道线 人行横道线&#xff0c;俗称斑马线&#xff0c;是由一条一条的白色线组成的&#xff0c;主要是用来让行人穿越马路的。 驾驶员驾驶车辆通过人行横道时应该减速缓行&#xff0c;注意礼让行人。 考核要求 当驾车进入路面有施划人行横道线的&#xf…

python学习-38迭代器和生成器

迭代器和生成器---- 迭代器协议和for循环工作机制1.迭代器协议&#xff1a;对象必须提供一个next方法&#xff0c;执行该方法要么返回迭代中的下一项&#xff0c;要么引起一个Stoplteration异常&#xff0c;以终止迭代&#xff08;只能往后走&#xff0c;不能往前走&#xff09…

[转载]基于Aaf的数据拆分

(本文适于使用Aaf框架的开发者阅读) 1. 基本原理 在Aaf框架中&#xff0c;“对象”和“存储”的关系映射有一个关键的纽带StorageAlias&#xff0c;即“存储别名”&#xff0c;同样一个类型&#xff0c;在不同的存储别名下&#xff0c;可以自由映射到任意存储“位置”。  “位…

靠边停车

什么是靠边停车 靠边停车是大路考中一个指标很明确的考核项目&#xff0c;要求学员驾驶车辆使之靠边停下。 操作方法 1、停车前&#xff0c;要通过内、外后视镜观察后方和右侧交通情况&#xff0c;开右转向灯。 2、适量踩下制动踏板。 3、向右转动方向盘(第一把轮…

RuntimeException 和 Exception 区别、异常的子父级关系

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.java 将所有的错误封装为一个对象&#xff0c;其根本父类为Throwable, Throwable 有两个子类&#xff1a;Error 和 Exception。 2.Err…

通过路口

操作方法 1、让车减速 2、观察路口的情况 3、通过路口 注意事项 1、不要抢黄灯 2、不要开英雄车&#xff0c;即红灯亮起时通过路口的最后一辆车 3、控制车速&#xff0c;控制在50km/h以下 4、看到左右车都减速时&#xff0c;也马上减速 5、要左转…

C语言笔记(关键字)

gdb调试 gcc 源程序 -g&#xff1b;加gdb调试信息gdb可执行程序&#xff1b;&#xff08;gdb调试&#xff09;l&#xff08;ist&#xff09;&#xff1a;查看源码&#xff0c;按一下从main开始10行以此往后l n&#xff1a;查看n处上下10行的源码run&#xff1a;运行程序b&…

自定义 Git - Git 钩子 (自动部署)

Git 钩子 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 和其它版本控制系统一样&#xff0c;Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子&#xff1a;客户端的和…

变更车道

操作方法 1、观察与判断观察车辆后方、侧方和准备变更的车道上的交通流情况&#xff1b; 2、确认安全后&#xff0c;打开转向指示灯示意&#xff0c;并再次通过后视镜观察两侧道路上有无车辆超越&#xff0c;确认准备驶入的车道是否允许留有安全距离&#xff1b; 3…

C语言笔记(符号)

注释符号 几个似非而是的注释问题 例子&#xff1a; (A) int / * ... * /i; (B) char * s "abcdefgh //hijklmn"; (C) //Is it a \valid comment? (D) in/ * ... * /t i; 我们知道C语言里可以有两种注释方式&#xff1a;“/* */” 和 “ // ”。那么上面几条…

直线行驶

考核要求 保证跟车安全速度和安全距离&#xff0c;了解车辆行驶速度、注意观察路面状况&#xff0c;采取相应措施。不能有左右摆动、方向不稳的现象。 考试口诀 一.寻找中心 二.双眼锁定本车能通行的中心 三.心理想着走中间 四.双眼从本车前面最突出点的.中心…