一、版本控制器git
安装git指令
yum install git
1.1 举例理解版本控制器
举个例子:
比方说老师要求我们交一份实验报告,而你的室友张三是一个非常勤奋的人,所以他很早就写好了第一版交给老师,但老师的要求很高,他觉得第一版不行,给了他一些修改意见,然后他在第一版的基础上写完第二版后,老师还是不满意,他又在第二版的基础上写出了第三版……就这样一直下去,当张三写到第八版的时候,老师发现他越改越差,还不如第二版,于是让张三交第二版就行,但此时张三就慌了,因为他一直在原来版本上修改,所以早就忘了第二版是什么样子的了。而你吸取了张三的教训,你也开始做实验报告,但是跟张三不同的是,每次老师给你打回来的时候,你都会将原先版本给保存一份然后再去修改,最后当老师想要第二版的时候,你就可以直接可以把第二版拿出来。(我在有意识地在保留前面的版本,因为可能未来会用到)
除此之外还有其他同学也要交实验报告,于是你想到了一个办法,你在老师办公室门口贴了一个告示“这个老师可能改到最后会需要之前的版本,你们可以加我微信,我给你们提供保存之前版本的服务”,于是乎很多同学开始加你的微信,然后你就开始给李四、王五、赵六……分别建了目录,他们会将旧的版本发给你保存,然后当他们需要的时候,找到你就可以找到之前的版本了。(说明许多人会存在这样的需求,可以提供相关的服务)
但是你的业务做得越来越大,你不断在复制和粘贴,不断有人找你索要之前的版本,你有点忙不过来了,于是你在思考:其实版本管理本质上不就是对文件进行重命名、拷贝等工作吗??那我能不能写一些软件来自动化这些无聊繁琐的工作??于是乎你写出了两个软件,一个是服务端负责版本管理,另一个是客户端负责给用户查看。然后你把两个软件合成了一个既可以做服务端也可以做客户端的软件(版本控制器的雏形开始出现了)
你给自己放置版本的地方起名叫做仓库,而当别人下载了你的软件之后,他如果在自己的电脑上做版本控制,那就是本地仓库,但是他可能会担心本地仓库的东西丢失,于是他又使用了你提供的云服务器,那就是远端仓库,然后推送到远端仓库。(所以git其实就是一款服务端和客户端为一体且具有网络功能的版本控制器,作用其实就是一种将客户的本地仓库和由你提供的云服务器上的远端仓库建立一个联系,帮助我们更好的版本管理和控制,远端仓库一般是大公司提供的云服务器,一般不会出问题,可以有效防止文件丢失)
其实实验报告都是有模版的,所以我们并不是非要每个人都写一份,可以是共同维护一份,这个操作就可以在远端进行(所以git还有一个作用就是方便多人协作)
以上的例子其实可以得到两点结论:
1、git是一款服务端和客户端为一体的具有网络功能的版本控制器
2、方便多人协作
当然在现实中,其实例子中的老师就相当于是我们的产品经理,而学生就相当于程序员,一个团队里面产品经理需要去分析用户的需求,然后再分工给程序员去完成项目,但是客户的需求可能是会不断发生变化的,所以这也就意味着我们需要对每一个版本都进行有效的管理和保持。
1.2 git究竟是如何诞生的
git的诞生其实也跟Linux的创始人雷纳斯托瓦斯有关系,其实Linux是一款操作系统,他的项目必然也是比较大的,所以当他开源之后,很多人开始写相关的代码,然后通过邮件等途径提交给他,他开始不断地进行重复的拷贝工作,但随着参与的人越来越多他开始忙不过来了,于是乎他开始把目光放到在市面上寻找一款软件能够进行自动化合并其他人代码并且更好地对Linux进行版本管理(一般来说即使是最顶尖的工程师,在遇到问题的时候第一反应不是自己要去做什么软件,而是市面上是否已经有更成熟的软件),但是当时市面上的版本控制器基本都是收费的,其实不是花不起这个钱,而是和开源精神不相符,其实主要是Linux的诞生的初衷就是为了让更多的人去使用和传播他,但是收费的版本控制器显然会阻挡一部分人去使用,收费的东西是不利于传播的。于是当时就有一个比较有情怀的公司,他们虽然是收费的,但是对Linux社区提供免费的服务,于是效率就开始变高了,他也成功解放了自己,不需要再去做一些枯燥的重复工作。但是由于写操作系统的人都是一些技术大佬,能力强好奇心重(也可能是因为他们发现版本控制器有漏洞,所以想要去破解源码解决问题),他们开始尝试去破解版本管理器的代码(因为这个版本管理器是别人公司用来赚钱的,所以提供给Linux社区使用的是加密的),于是乎这个公司的老板不就不爽了,觉得自己好心给你们免费使用,你们倒反而来破解我的软件,我的公司可都是靠着这个软件去生存的!!!于是乎这个老板就不让Linux社区用他的版本控制器了!!一刀两断
于是乎又一夜回到解放前,吸取了这次的教训,他发现求人不如求己,于是乎他花费了几周的时间写了一段版本控制器的demo,把他像Linux一样开源出去,于是又一窝蜂去搞这个东西,于是很快,git就出现了!!!!
但是git并不是所有人会去操作和使用的,所以有人就想能不能基于git这个工具去搞一个网站,就像以Linux内核开发出来的商业版centos和ubuntu一样,git也出现了他的商业化网站——github和gitee
1.3 git的使用(命令行用法)
1、新建仓库
2、找到对应的地址,把远端仓库拉取到本地(第一版斧头)
命令:git clone 地址
然后你的文件夹里会多了一个对应的文件。 然后我们可以 ls -al可以看到全部的文件
3、 将本地仓库里的文件拷贝远端仓库
为了方便测试我们将一些代码统一放到一个testgit文件,然后进入当远端仓库目录进行拷贝
命令:cp ../testgit . -rf
4、add+commit (第二板斧)
命令 :git add .
git commit -m “说明” (引号里的内容非常重要,是对我们文件的提交日志)
如上图,git的首次使用需要配置邮箱和用户名(为了追根溯源,方便找到这个代码的源头)
命令:git config --global user.email “你的邮箱”
git config --global user.name “你的用户名”
5、push(第三板斧)
命令 :git push
需要输入用户名和密码
1.4 git的其他说明
1、git log可以查看提交记录
2、git status可以查看当前目录的状态
如果我们创建一个新的文件夹test ,他会提示你当前test文件还没有托管到本地仓库(commit)
当你add+commit后,他会提示你当前文件已经托管到本地仓库了,但是还没同步到远端(push)
然后你push之后就不需要做任何操作了
所以一般来说他会展示3种情况:(1)当前目录存在但是还没有托管到本地仓库的文件(2)已经托管到本地仓库的文件但是还没有同步到远端(3)不需要任何操作
3、 .gitignore可以忽视我们不想上传的文件
(1)其实就是一款配置文件,而里面的后缀的相关文件不允许被加入进去
(2)不要忘记“*”,这是一个通配符
(3)我们可以自己进行操作,把我们不想加入进去的文件对应的后缀写进去
4、可以删除仓库和清空仓库
二、Linux调试器gdb
安装gdb:yum install gdb
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项(前期准备工作)!!
一些背景知识了解:一个公司想去独立完成一个项目,一般来说首先需要一个团队,需要产品经理+项目经理+若干程序员,由产品经理分析市场需求然后下发给项目经理,然后项目经理再将任务下发给其他程序员。而一般来说代码写出来之后还需要测试,可能是单独分配了一个测试人员给这个团队,也有可能测试是一个独立的部门,然后会将整个公司的代码都丢给这个部门去测试。一般来说我们遇到问题的时候首先考虑的是看看能不能直接通过代码逻辑去找到问题,然后其次可能会加入一些打印之类的测试代码,最后最后一般才会考虑使用gdb这些调试工具,因为使用这类调试工具最重要的就是定位错误,所以需要思考可能发生的各种错误然后去打断点定位调试,所以比较麻烦,但作为程序员还是需要去掌握的!!!
命令:gdb 可执行程序
1、有关代码展示
list(l) 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list(l) 函数名:列出某个函数的源代码。
如果我们想要展示所有的代码,可以先l 0,然后因为gdb是有记忆的,所以可以不断回车就会慢慢打印出所有的代码
2、有关程序运行
r或run:运行程序(默认会直接结束或者跳到下个断点)
n 或 next:把函数当成一个语句(逐过程)
s或step:不会跳过代码块(逐语句)
3、有关断点
break(b) 行号:在某一行设置断点
break(b) 函数名:在某个函数开头设置断点
info(i) break(b) :查看断点信息。
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
设置并查看断点
当你调试过后,他还会显示调试痕迹
我们也可以根据序号去删除断点
还有一种场景,比方说我们有3个断点,然后我确认了第2个断点没什么问题,但是我不想删掉第二个断点(为了保留调试痕迹),所以就可以使用disable去禁用断点
4、关于控制变量
p 变量:打印变量值。
set var:修改变量的值
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
可以在运行中打印出我们想查看变量的值,也可以强制修改(间接可以帮助我们快速跳出循环)
display就可以让我们一直跟踪这个值,每次都打印出来
i locals直接查看当前栈帧的所有局部变量的值
bt直接查看当前函数的调用情况,以及栈帧(方便我们看到整个调用链)
5、有关跳转定位
调试80%都是围绕定位展开的,因为要根据错误的上下文信息去修改错误。
finish:执行到当前函数返回,然后挺下来等待命令(走到该函数最后)
until X行号:跳至X行(方便我们快速跳出循环)
continue(或c):从当前位置开始连续而非单步执行程序(帮助我们从当前断点直接跳到下一个断点)
run(或r):从开始连续而非单步执行程序(向下运行程序)
6、有关退出
quit(q):退出gdb