一、Linux命令行git
1. git是什么
git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds(Linux之父)为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
下面我们举一个例子来深入理解git:
比如当你在本地写好某一个编程文档时,发现有些地方需要修改或者删除,有的人可能会直接在当前文件中直接修改,有的人会复制一份在上面修改,然后删除没用的文件。但是当你发现还是原来的文件好或者另外的版本好时,就可能手足无措了。
此时使用git工具,就是聪明之举了。我们可以在本地建一个版本库,每当我们需要修改时,就可以把之前的版本提交并标明此版的特点。这样文件夹里就只有一个编程文档了。当你需要哪个版本时,只要在版本库中恢复一下就可以了。
2. Gitee上创建仓库,克隆仓库到本地
💖 创建仓库:
这里我们先到Gitee上创建一个仓库。
当我们创建仓库时,可以将其初始化一下,例如:选择语言,表示我们要在这个仓库中提交什么编程语言的代码,以及添加.gitignore
,.gitignore
的作用是为了帮助我们忽略一些不需要提交到仓库的文件,比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。下面的Readme文件呢就是对仓库的介绍。最后我们点击创建就可以成功在Gitee上创建一个仓库了。
💕 克隆仓库到本地
(一)这里打开我们新创建的仓库,然后右边有个==克隆/下载==,我们点一下然后在弹出的选项中选择右边的复制就可以复制到远端仓库的链接。
(二)接下来我们打开我们的xshell,输入指令将仓库克隆到本地。
git clone 远端仓库链接
这里的learn_-linux
就是我们远端的仓库,现在他已经被我们克隆到了本地,当然因为仓库在初始化的时候并不能直接设置为开源仓库,所以在我们进行克隆的时候他可能需要我们输入用户名和密码,这里我们直接把我们的Gitee账号的用户名和密码输入即可解决。
3. git三板斧
git add
将新增文件添加到暂存区
这里我们需要先将进入我们的仓库,然后新建一个目录将需要提交的代码拷贝这个目录下,:
这里我们可以看到之前写的代码已经被拷贝到了目标文件夹下,接下来我们进行git add
操作。
在我们使用git add
进行操作后,我们可以使用git status
指令查看暂存区状态,这里我们可以看到刚刚我们新0拷贝过来的文件已经在暂存区了。
git commit
将暂存区的文件添加到本地仓库
💕 指令:
git commit -m '日志'
我们这里的日志一定要写清楚所提交的代码主要是什么或者更改后新增加了什么样的功能,解决了什么bug,因为别人是可以看到我们的日志信息的,所以这个日志信息我们一定要认真写。
这里我们可以用git log
指令来查看我们之前所提交的记录,以及我们提交者的姓名和邮箱都可以被清楚的查看到,所以我们在提交的时候一定要注意日志信息那些的。当然我们也可以使用git reflog
指令来粗略的查看我们提交日志的记录。
git push
将本体仓库新增内容推送到远端
这里我们经过最后的git push
之后就可以在我们的Gitee上看到我们所提交的代码了:
二、Linux调试器-gdb的使用
1. debug和release的区别
我们知道程序的发布方式有两种,debug模式和release模式。
Debug:调试版本,包含调试信息,所以容量比Release大很多,并且不进行任何优化(优化会使调试复杂化,因为源代码和生成的指令间关系会更复杂),便于程序员调试。
Release:发布版本,不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的。(调试信息可在单独的PDB文件中生成)。
gdb呢其实就是Linux下的一个调试器,它可以通过指令的方式对我们的代码进行调试。但是平常我们在使用gcc对我们的代码进行编译的时候生成的默认版本是release版本,是不能进行调试的,所以我们在使用makefile的时候可以给我们的gcc 编译选项带上-g
选项,这样我们的gcc在编译代码的时候默认生成的就是debug版本了。
2. 常用命令
gdb 可执行程序
:开始调试
这里我们需要注意,当我们使用gdb进行调试的时候只能对我们生成的可执行程序进行调试。
l 行号/函数名
:显示源码
这里我们从第0行开始显示,当我们按下指令后他会给我们显示从我们想要看的那一行代码往下的10行代码,当我们想要往下翻的时候,只需要再次输入
l
或者回车
即可给我们显示接着上次代码的内容往下列,每次显示10行。
当然这里我们也需要注意如果我们要是在调试的过程中想要看代码的时候也可以直接使用l 行号
来查看,这里显示代码并不会影响我们的调试。
r
:开始调试
如果我们已经在某一行打了断点,当我们输入
r
后他会直接跳转到我们的断点处停下来,如果当前调试的过程中没有打断点,那么则会直接将整个程序执行完然后停下来。
b 行号/函数名
:打断点/ info b
:查看断点
这里我们需要注意的是:在我们查看断点时,
Num
表示的是断点的编号,Enb
表示断点的状态是否打开,y表示断电开启,n表示断点关闭。What
则表示断电具体所在的位置。
d 断点编号/break
:删除断点
这里我们需要注意的是
d 断点编号
表示的是删除指定编号的断点,d break
表示的是删除所有断点,当我们删掉断点后在使用info指令去查看断点时,就会显示断点不存在。
disable b 断点编号
:关闭指定断点/ enable b 断点编号
:开启指定断点
这里我们可以看到,当我们
disable
将断点关闭后Enb
显示的断点是关闭状态,当使用enable
将断点打开后Enb
显示的断点是开启状态。
n
:逐过程调试
这里我们可以看到执行
n
指令后,一次就可以跳过一个函数,和vs中的f10类似。
s
:逐语句调试
当我们使用
s
指令进行调试的时候发现可以进入函数内部,然后一条一条语句执行,和vs中的f11类似。
display
:长显示(内置类型,结构体等自定义类型)
undisplay
:取消长显示
until 行号
:在函数内进行指定位置跳转,执行完区间代码
这里我们可以看到直接从断点处执行到了我们的18行。
c
:从一个断点处直接运行至下一个断点处
当然gdb中还有很多其他的指令可以进行调试,这里就不一一列举了。
- list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
- list/l 函数名:列出某个函数的源代码。
- r或run:运行程序。
- n 或 next:单条执行。
- s或step:进入函数调用
- break(b) 行号:在某一行设置断点
- break 函数名:在某个函数开头设置断点
- info break :查看断点信息。
- finish:执行到当前函数返回,然后挺下来等待命令
- print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
- p 变量:打印变量值。
- set var:修改变量的值
- continue(或c):从当前位置开始连续而非单步执行程序
- run(或r):从开始连续而非单步执行程序
- delete breakpoints:删除所有断点
- delete breakpoints n:删除序号为n的断点
- disable breakpoints:禁用断点
- enable breakpoints:启用断点
- info(或i) breakpoints:参看当前设置了哪些断点
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值
- undisplay:取消对先前设置的那些变量的跟踪
- until X行号:跳至X行
- breaktrace(或bt):查看各级函数调用及参数
- info(i) locals:查看当前栈帧局部变量的值
- quit:退出gdb