[1.git 版本控制器 的 概念 和 意义](#1.git 版本控制器 的 概念 和 意义)
[2. Linux 中 git 操作流程](#2. Linux 中 git 操作流程)
[2.1 gitee 远端 创建仓库](#2.1 gitee 远端 创建仓库)
[2.2 管理 git 远程仓库](#2.2 管理 git 远程仓库)
[2.3 Linux 利用 git 命令 拉取本地仓库](#2.3 Linux 利用 git 命令 拉取本地仓库)
[2.30 git --version](#2.30 git --version)
[2.31 sudo yum/apt install -y git](#2.31 sudo yum/apt install -y git)
[2.32 git clone [仓库网址]](#2.32 git clone [仓库网址])
[2.33 仓库就是目录,远端仓库内容都会在其中](#2.33 仓库就是目录,远端仓库内容都会在其中)
[2.34 clone 报错处理](#2.34 clone 报错处理)
[2.4 .git 是真正的仓库,它会记录修改记录id](#2.4 .git 是真正的仓库,它会记录修改记录id)
[2.5 git 三板斧 ------ 测试修改id,代码变化,本地远端同步](#2.5 git 三板斧 —— 测试修改id,代码变化,本地远端同步)
[git 三板斧 ------ add ,commit ,push](#git 三板斧 —— add ,commit ,push)
[git add [路径] ------ 把工作区的修改,提交到暂存区](#git add [路径] —— 把工作区的修改,提交到暂存区)
[git commit -m "提交日志,必须好好写" ------ 把暂存区内容,提交到本地仓库(.git保存修改id)](#git commit -m "提交日志,必须好好写" —— 把暂存区内容,提交到本地仓库(.git保存修改id))
[git push ------ 将本地仓库修改内容,推送到远端仓库同步](#git push —— 将本地仓库修改内容,推送到远端仓库同步)
[.git 中修改记录的变化](#.git 中修改记录的变化)
[git 首次使用必须配置gitee用户名 + 邮箱](#git 首次使用必须配置gitee用户名 + 邮箱)
[git log ------ 查看提交信息,无法修改](#git log —— 查看提交信息,无法修改)
[git status ------ 查看本地仓库状态](#git status —— 查看本地仓库状态)
[3. git :工作区,暂存区,本地仓库](#3. git :工作区,暂存区,本地仓库)
[工作区:整个 git 所在目录,除了 .git](#工作区:整个 git 所在目录,除了 .git)
本地仓库:代码版本已被.git永久保存控制,随时可查看、推送
[4. .gitignore 配置文件 ------ 过滤掉指定后缀的文件](#4. .gitignore 配置文件 —— 过滤掉指定后缀的文件)
[5. 远端 / 本地仓库,需要先同步了再提交](#5. 远端 / 本地仓库,需要先同步了再提交)
[5.1 git pull ------ 同步 远端 与 本地仓库,避免覆盖别人修改的代码](#5.1 git pull —— 同步 远端 与 本地仓库,避免覆盖别人修改的代码)
[5.2 修改合并 ------ 远端与本地,都修改了同一个文件,需要我们自己处理如何处理](#5.2 修改合并 —— 远端与本地,都修改了同一个文件,需要我们自己处理如何处理)
[6. gdb / cgdb 调试器](#6. gdb / cgdb 调试器)
[6.1gdb / cgdb是什么? ------ 指令,用于调试](#6.1gdb / cgdb是什么? —— 指令,用于调试)
[6.2 软件分release和debug版本](#6.2 软件分release和debug版本)
[6.3 gcc -g ------ 生成debug版](#6.3 gcc -g —— 生成debug版)
[7. gdb / cgdb 调试器 怎么用?](#7. gdb / cgdb 调试器 怎么用?)
[7.1 cgdb: 与gdb指令一致,调试体验更好](#7.1 cgdb: 与gdb指令一致,调试体验更好)
[7.2 cgdb [debug版本程序] ------ 进入调试界面](#7.2 cgdb [debug版本程序] —— 进入调试界面)
[7.3 调试器只是一个辅助工具------不要为了调试而调试](#7.3 调试器只是一个辅助工具——不要为了调试而调试)
[7.4 cgdb 调试器 的常用指令](#7.4 cgdb 调试器 的常用指令)
[7.41 list / l + [行号] ------ 显示附近源代码](#7.41 list / l + [行号] —— 显示附近源代码)
[7.42 break / b + [行号] ------ 打断点,无法打空行,区域化的执行代码](#7.42 break / b + [行号] —— 打断点,无法打空行,区域化的执行代码)
[7.43 info b ------ 查看端点信息,编号](#7.43 info b —— 查看端点信息,编号)
[7.44 run / r ------ 运行程序,遇到断点中止,没断点就结束](#7.44 run / r —— 运行程序,遇到断点中止,没断点就结束)
[7.45 delete / d [断点编号] [断点编号]...------ 单次,批量化删除断点](#7.45 delete / d [断点编号] [断点编号]...—— 单次,批量化删除断点)
[7.46 disable [断点编号] ------ 保留断点,但失去作用](#7.46 disable [断点编号] —— 保留断点,但失去作用)
[7.47 enable [断点编号] ------ 启用断点,使能](#7.47 enable [断点编号] —— 启用断点,使能)
[7.48 c ------继续运行代码,遇到下一个断点中止,没断点就结束](#7.48 c ——继续运行代码,遇到下一个断点中止,没断点就结束)
[7.49 b 函数名 ------ 自动在函数内第一行打断点](#7.49 b 函数名 —— 自动在函数内第一行打断点)
[7.410 step / s ------ vs F11 ------ 逐语句执行,进入函数](#7.410 step / s —— vs F11 —— 逐语句执行,进入函数)
[7.411 next / n ------ vs F10 ------ 逐过程执行,不进入函数](#7.411 next / n —— vs F10 —— 逐过程执行,不进入函数)
[7.412 print / p [&][变量名] ------ 打印变量的地址或值](#7.412 print / p [&][变量名] —— 打印变量的地址或值)
[7.413 display [&][变量名] ------ 长时间展示变量内容或地址,便于观测变化](#7.413 display [&][变量名] —— 长时间展示变量内容或地址,便于观测变化)
[7.414 undisplay [编号1] [编号2]...------ 可单次,批量次删除常展示的变量](#7.414 undisplay [编号1] [编号2]...—— 可单次,批量次删除常展示的变量)
[7.415 until [行号] ------ 快速跳过栈帧内的循环,最多只能执行完当前函数,不会跳转函数外其他行](#7.415 until [行号] —— 快速跳过栈帧内的循环,最多只能执行完当前函数,不会跳转函数外其他行)
[7.416 finish ------ 执行当前函数,执行完就停止](#7.416 finish —— 执行当前函数,执行完就停止)
[7.417 backtrace / bt ------ 查看当前函数的调用栈,调用到哪里了](#7.417 backtrace / bt —— 查看当前函数的调用栈,调用到哪里了)
[7.418 info local ------ 展示局部变量的值](#7.418 info local —— 展示局部变量的值)
[7.419 p [表达式] ------ 可以打印表达式的值,用于计算数值,函数内可简单验证调试](#7.419 p [表达式] —— 可以打印表达式的值,用于计算数值,函数内可简单验证调试)
[7.5 cgdb 高级调试技巧](#7.5 cgdb 高级调试技巧)
[7.51 watch [变量名]------ 监测点,监测变量变化,发生变化会提示变化过程](#7.51 watch [变量名]—— 监测点,监测变量变化,发生变化会提示变化过程)
[7.52 set var [变量名]=[新内容]------ 动态修改源码的变量,方便直接编辑代码](#7.52 set var [变量名]=[新内容]—— 动态修改源码的变量,方便直接编辑代码)
[7.53 b [行号] if [变量]==[内容] ------ 条件断点满足条件,就断住程序,跳过部分循环](#7.53 b [行号] if [变量]==[内容] —— 条件断点满足条件,就断住程序,跳过部分循环)
[7.54 condition [断点编号] [变量名]==[内容] ------ 普通断点,追加为条件断点](#7.54 condition [断点编号] [变量名]==[内容] —— 普通断点,追加为条件断点)
[7.55 Esc / 滚轮 -> 代码屏,s+enter / i -> 调试屏](#7.55 Esc / 滚轮 -> 代码屏,s+enter / i -> 调试屏)
1.git 版本控制器 的 概念 和 意义
版本控制器 是 对代码,文件进行版本管理的工具,常用于团队开发项目,便于统一管理代码的版本
git 具有版本控制功能,具有网络同步功能。现在的gittub,gitee都是基于git
其意义:提高开发效率,方便管理项目、文件,推动开源浪潮发展
项目经过 -> 思路设计 -> 环境构建 -> 代码编写 -> 程序调试 -> 完成上线 几个步骤,并且大项目常常需要多人共同管理
没有版本控制器前,本地保存,拷贝上传,多人同步代码,多人修改代码,合并代码等操作,十分麻烦,并且每个都要手动管理,很大程度降低了开发效率。
人多起来,就更难管理,加上版本管理器基本都是闭源收费的软件,于是****大佬自己手写了开源免费软件的版本管理器------git
2. Linux 中 git 操作流程
2.1 gitee 远端 创建仓库
提一句:勾选设置模板,勾选readme . readme在开发中比较重要,
如其名:读我。 他是用来总结这个工程,或者是重要提醒的!
2.2 管理 git 远程仓库
2.3 Linux 利用 git 命令 拉取本地仓库
2.30 git --version
提供git版本信息,可用于比对版本,或者确认安装状态

2.31 sudo yum/apt install -y git
Linux 可以使用 git 的命令,可能没有下载,需要先用包管理器下载安装:
sudo yum/apt install -y git
2.32 git clone [仓库网址]



2.33 仓库就是目录,远端仓库内容都会在其中


2.34 clone 报错处理
可能需要你输入gitee的账号密码。

2.4 .git 是真正的仓库,它会记录修改记录id
远端仓库 克隆 到本地,本质是一个拷贝。后面上传提交修改时,远端怎么知道我们修改了什么?
其实上面已经讲过,每次修改代码 / 文件内容,都会在内部记录下来,以 id 的形式记录每次修改
这些id记录,都存储在仓库文件的 .git 目录中:

2.5 git 三板斧 ------ 测试修改id,代码变化,本地远端同步
git 三板斧 ------ add ,commit ,push
git add [路径] ------ 把工作区的修改,提交到暂存区

git commit -m "提交日志,必须好好写" ------ 把暂存区内容,提交到本地仓库(.git保存修改id)





git push ------ 将本地仓库修改内容,推送到远端仓库同步


.git 中修改记录的变化



git 首次使用必须配置gitee用户名 + 邮箱


git log ------ 查看提交信息,无法修改

git status ------ 查看本地仓库状态

3. git :工作区,暂存区,本地仓库
git add : 把修改信息,从 工作区 提交到 暂存区(仓库)
git commit : 把修改信息,从 暂存区 提交到 本地仓库(.git,真正的仓库)
git push:本地仓库 和 远端仓库 同步
工作区:整个 git 所在目录,除了 .git
暂存区:意义是确认最终提交,以防可能修改错了
本地仓库:代码版本已被.git永久保存控制,随时可查看、推送
4. .gitignore 配置文件 ------ 过滤掉指定后缀的文件
忽略后缀用的配置文件。我们的项目哪怕hello.c ,都存在很多临时文件,他们是各种后缀
.slo,.log,.o,.i等。他们都不是我们需要提交的源文件.c,于是.gitignore出现了
目的就是便于筛选需要上传的文件,过滤掉指定后缀的文件
5. 远端 / 本地仓库,需要先同步了再提交
远端仓库 可能是多人管理,本地仓库只有自己管理
推送远端仓库时,本质是将 .git 中提交记录,版本,分支等修改的信息,同步到远端仓库
这是建立在,只有本地仓库发生变化,远端没发生变化的情况下。
如果远端同时也被别人修改了,两个仓库内容都发生了变化,贸然上传同步,只会覆盖掉远端中,别人修改的内容!
git 当然不允许这么做,就不会同意你 push,需要先pull ------ 同步远端与本地仓库
5.1 git pull ------ 同步 远端 与 本地仓库,避免覆盖别人修改的代码

5.2 修改合并 ------ 远端与本地,都修改了同一个文件,需要我们自己处理如何处理
由于同一个文件,被多个人修改了,git无法判断需要保留谁的代码
此时即便pull,也没用,git只会把两个修改都合并起来,简单分隔开,
然后提示你们,交给你们来讨论该怎么处理!
当项目管理十分糟糕时,难免会遇到这种情况。
6. gdb / cgdb 调试器
6.1gdb / cgdb是什么? ------ 指令,用于调试
gdb / cgdb 是调试器,类似于vs 2022的调试模式,它是Linux下的调试模式。
可以打断点,条件断点,查看局部,全局变量变化过程,可以区域化,精细化查看代码运行过程,进而帮助我把你发现问题。
Linux下一切皆文件,gdb / cgdb也不例外:他们都是文件,指令,二进制的可执行程序。
Linux平台可能本身不自带,需要用包管理器下载安装
6.2 软件分release和debug版本
软件分release和debug版本
release版本:内部不包含调试信息,无法调试。内存占用较小,运行较快
debug版本:内部包含部分调试信息,方便我们调试时查看信息,发现问题。内存占用较大,运行较慢

6.3 gcc -g ------ 生成debug版
gcc、g++编译,默认生成release版可执行程序
gcc -g 可生成debug版
7. gdb / cgdb 调试器 怎么用?
7.1 cgdb: 与gdb指令一致,调试体验更好
gdb 和 cgdb 内部指令基本一致,但cgdb是可视化版本,比gdb好观察,所以接下来主要讲解cgdb的用法
7.2 cgdb [debug版本程序] ------ 进入调试界面

7.3 调试器只是一个辅助工具------不要为了调试而调试
调试的本质是什么? 调试的本质就是帮助我们分析代码,解决问题
它本质就一个辅助工具。 调试的办法有很多:
可以自己cout打印日志,问Ai,使用搜索引擎,或者肉眼硬看。
调试器不是必备,只要能解决问题,就行,不要调试而调试。
7.4 cgdb 调试器 的常用指令
| 命令 | 作用 | 样例 |
|---|---|---|
list / l |
显示源代码,从上次位置开始,每次列出 10 行 | list / l 10 |
list / l 函数名 |
列出指定函数的源代码 | list / l main |
list / l 文件名:行号 |
列出指定文件的源代码 | list / l mycmd.c:1 |
r / run |
从程序开始连续执行 | run |
n / next |
单步执行,不进入函数内部(逐过程,类似 F10) | next |
s / step |
单步执行,进入函数内部(逐语句,类似 F11) | step |
break / b [文件名:] 行号 |
在指定行号设置断点 | break 10 / break test.c:10 |
break / b 函数名 |
在函数开头设置断点 | break main |
info break / b |
查看当前所有断点的信息 | info break |
finish |
执行到当前函数返回,然后停止 | finish |
print / p 表达式 |
打印表达式的值 | print start+end |
p 变量 |
打印指定变量的值 | p x |
set var 变量=值 |
修改变量的值 | set var i=10 |
continue / c |
从当前位置开始连续执行程序 | continue |
delete / d breakpoints |
删除所有断点 | delete breakpoints |
delete / d breakpoints n |
删除序号为 n 的断点 | delete breakpoints 1 |
disable breakpoints |
禁用所有断点 | disable breakpoints |
enable breakpoints |
启用所有断点 | enable breakpoints |
info / i breakpoints |
查看当前设置的断点列表 | info breakpoints |
display 变量名 |
跟踪显示指定变量的值(每次停止时) | display x |
undisplay 编号 |
取消对指定编号的变量的跟踪显示 | undisplay 1 |
until X 行号 |
执行到指定行号 | until 20 |
backtrace / bt |
查看当前执行栈的各级函数调用及参数 | backtrace |
info / i locals |
查看当前栈帧的局部变量值 | info locals |
quit |
退出 GDB 调试器 | quit |
7.41 list / l + [行号] ------ 显示附近源代码


7.42 break / b + [行号] ------ 打断点,无法打空行,区域化的执行代码
7.43 info b ------ 查看端点信息,编号

7.44 run / r ------ 运行程序,遇到断点中止,没断点就结束

7.45 delete / d [断点编号] [断点编号]...------ 单次,批量化删除断点

7.46 disable [断点编号] ------ 保留断点,但失去作用

7.47 enable [断点编号] ------ 启用断点,使能

7.48 c ------继续运行代码,遇到下一个断点中止,没断点就结束


7.49 b 函数名 ------ 自动在函数内第一行打断点

7.410 step / s ------ vs F11 ------ 逐语句执行,进入函数
7.411 next / n ------ vs F10 ------ 逐过程执行,不进入函数


7.412 print / p [&][变量名] ------ 打印变量的地址或值

7.413 display [&][变量名] ------ 长时间展示变量内容或地址,便于观测变化

7.414 undisplay [编号1] [编号2]...------ 可单次,批量次删除常展示的变量

7.415 until [行号] ------ 快速跳过栈帧内的循环,最多只能执行完当前函数,不会跳转函数外其他行


7.416 finish ------ 执行当前函数,执行完就停止

7.417 backtrace / bt ------ 查看当前函数的调用栈,调用到哪里了


7.418 info local ------ 展示局部变量的值


7.419 p [表达式] ------ 可以打印表达式的值,用于计算数值,函数内可简单验证调试

7.5 cgdb 高级调试技巧
7.51 watch [变量名]------ 监测点,监测变量变化,发生变化会提示变化过程
作用:监管住 不想被修改的值!比如指针
一旦发生变化,就会弹出提示,提醒你变化过程,你就知道它被修改了
info b 可查看 监测点: delete [断点编号] 正常删除
7.52 set var [变量名]=[新内容]------ 动态修改源码的变量,方便直接编辑代码
如果我们发现问题,是一个变量比如flag=0,需要更改为1,我们需要:
退出cgdb,vim打开源码,i插入模式,修改错误变量,退出vim,重新生成程序,运行...
这很麻烦!直接:set var flag=1 ,就完事了!
7.53 b [行号] if [变量]==[内容] ------ 条件断点满足条件,就断住程序,跳过部分循环
循环中,100次循环,每次都最后几次出错,就设置条件断点:当i == 97,触发断点,然后再逐语句,精细化调试,最后发现问题。
条件断点的作用就是快速跳过没问题的循环部分,解决了循环只有跳过和一步步的极端情况
同样的做法也可以是:手动设置条件断点:
不过麻烦,还得重新编辑,生成可执行程序,不如条件断点便捷。
if (i == 90) { int t = 0; //设置一个语句,断点打这里,同样的效果 }
7.54 condition [断点编号] [变量名]==[内容] ------ 普通断点,追加为条件断点
7.55 Esc / 滚轮 -> 代码屏,s+enter / i -> 调试屏
经常光标跑上面去了,这是切换方法。

























