本文为 Linux 开发工具专题的第五部分,涵盖 Git 版本控制 的核心概念与命令行操作(本地仓库、远端仓库、冲突解决),以及 GDB 调试器 的入门使用(debug/release 模式、断点、单步执行)。同时补充进度条程序中的回调函数解耦设计。帮助同学们掌握代码托管与调试的基本技能。
一、进度条程序补充:回调函数解耦
上节课我们编写了命令行进度条,但代码中进度刷新逻辑与下载业务强耦合。为了让业务模块(下载/上传)专注于自身逻辑,刷新行为独立,我们引入函数指针(回调函数) 进行解耦。
最终效果:

优点:业务模块(download)不需要知道具体的刷新函数,只需要调用回调指针,未来可轻松替换为其他显示方式(如日志、无输出等)。
二、Git 版本控制
2.1 什么是版本控制?
场景故事(老师 vs 学生):
-
张三(学生)写完实验报告交给老师,老师不满意,要求修改。张三反复修改多次,最后老师却说"还不如第一次的版本",但张三已经找不到最初版本了。
-
李四(聪明的学生)每次修改前先将当前版本备份 (手动
Ctrl+C/V并重命名V1,V2,V3...),当老师要求回退时,可以立刻拿出指定版本。
版本控制的核心 :能够保存文件的历史版本,并支持随时回滚到任意历史状态。
为什么要版本控制?
-
应对善变的甲方/产品经理
-
多人协作时合并代码
-
记录开发过程,便于问题追溯
2.2 Git 的基本概念
| 概念 | 说明 |
|---|---|
| 本地仓库 | 存放在你电脑上的版本库(.git 目录),包含所有历史记录 |
| 远端仓库 | 存放在服务器(如 GitHub、Gitee)上的版本库,用于备份与协作 |
| 工作区 | 你当前编辑文件所在的目录 |
| 暂存区 | 介于工作区和本地仓库之间的临时区域,用于准备提交 |
| 提交(commit) | 将暂存区的内容永久保存到本地仓库,生成一个版本快照 |
2.3 Git 的历史
-
Git 的作者是 Linus Torvalds(Linux 之父)。
-
早期 Linux 内核开发需要版本控制软件,但市面上的商业软件要么收费,要么不符合开源精神。Linus 决定自己写一个,花了两到三周完成了第一版 Git,并开源。
-
Git 是去中心化、分布式的版本控制系统,每个开发者本地都有完整的仓库副本。
2.4 Git 命令行操作(Linux)
2.4.1 安装 Git
# CentOS sudo yum install -y git # Ubuntu sudo apt install -y git # 检查版本 git --version
2.4.2 首次配置(必须)
git config --global user.name "你的名字" git config --global user.email "你的邮箱"
提交记录会显示这些信息,务必与 Gitee/GitHub 注册邮箱一致,否则小绿点不更新。
2.4.3 从远端克隆仓库
先在 Gitee/GitHub 上创建一个空仓库(可以勾选 README.md 和 .gitignore),获取 HTTPS 链接。
git clone https://gitee.com/你的用户名/仓库名.git cd 仓库名
2.4.4 查看仓库状态
git status
2.4.5 添加文件到暂存区
git add 文件名 # 添加单个文件 git add . # 添加当前目录所有变化
2.4.6 提交到本地仓库
git commit -m "本次提交的说明信息"
提交信息必须清晰描述改动内容,不可随意填写。日后git log可查看所有历史提交。
2.4.7 推送到远端仓库
git push
- 首次推送可能需要输入 Gitee/GitHub 的用户名和密码(或 token)。
2.4.8 拉取远端更新
git pull
- 当本地仓库落后于远端时(别人已经推送了新代码),需要先
git pull同步,再推送。
2.4.9 查看提交历史
git log
2.4.10 忽略不需要提交的文件(.gitignore)
在仓库根目录创建 .gitignore 文件,写入要忽略的文件后缀或文件名:
- 被忽略的文件不会被
git add添加,也不会被提交。
2.5 多平台协作与冲突解决
场景 :你在 Linux 上修改并推送了代码,然后在 Windows 上继续修改。Windows 上修改后推送时,会因为远端已有新提交而拒绝推送(冲突)。
解决步骤:
-
在 Windows 上先执行
git pull,将远端的新代码拉取到本地。 -
Git 会自动合并,如果合并失败(同一行都被修改),需要手动编辑冲突文件,删除
<<<<<<<,=======,>>>>>>>标记,保留正确内容。 -
再次
git add、git commit、git push。
避免冲突的建议 :多人协作时,尽量在不同文件或不同区域修改,频繁
git pull保持同步。
2.6 Git 的底层原理(了解)
-
.git目录就是本地仓库,里面存储了所有版本变化。 -
Git 记录的是变化(diff),而不是每次保存整个文件副本,因此高效。
-
每次提交会生成一个唯一的哈希 ID(如
3b8e...),用于标识版本。
三、GDB 调试器
3.1 Debug 模式 vs Release 模式
| 模式 | 特点 | 体积 | 调试信息 |
|---|---|---|---|
| Debug | 包含调试符号,可单步、断点 | 较大 | 有 |
| Release | 优化后,无调试符号,不可调试 | 较小 | 无 |
-
gcc/g++ 默认编译的是 Release 模式,无法用 GDB 调试。
-
要生成 Debug 版本,编译时加
-g选项:
gcc -g -o mycode mycode.c
3.2 GDB 基本使用
3.2.1 启动 GDB
gdb 可执行程序
退出:quit 或 q
3.2.2 查看源代码
list # 显示当前行附近的代码(简写 l) l 1 # 从第1行开始显示
3.2.3 设置断点
break 行号 # 在该行打断点(简写 b) break 文件名:行号 break 函数名
3.2.4 查看断点
info breakpoints # 或 i b
3.2.5 删除断点
delete 断点编号 # 简写 d
断点编号用info breakpoints查看,删除时必须用编号,不能用行号。
3.2.6 运行程序
run # 简写 r
-
若未设置断点,程序直接运行结束。
-
若有断点,程序会在第一个断点处暂停。
3.2.7 单步执行
| 命令 | 简写 | 作用 | 类比 VS2022 |
|---|---|---|---|
next |
n |
逐过程(不进入函数内部) | F10 |
step |
s |
逐语句(进入函数内部) | F11 |
- GDB 会自动记录上一条命令,直接按 回车 可重复执行上一条命令。
3.2.8 继续执行到下一个断点
continue # 简写 c
3.2.9 重新运行
run # 重新从头开始调试
3.3 CGDB:可视化 GDB
- CGDB 是 GDB 的增强版,上方显示源代码,下方是命令输入区,更直观。
sudo yum install -y cgdb # CentOS sudo apt install -y cgdb # Ubuntu cgdb 可执行程序

- CGDB 的所有命令与 GDB 完全一致,只是界面友好。
四、本节课总结
4.1 Git 核心命令
| 命令 | 作用 |
|---|---|
git clone <仓库链接> |
克隆远端仓库到本地 |
git status |
查看工作区状态 |
git add . |
添加所有修改到暂存区 |
git commit -m "说明信息" |
提交到本地仓库 |
git push |
推送到远端 |
git pull |
拉取远端更新 |
git log |
查看提交历史 |
git config --global |
配置用户名和邮箱 |
4.2 GDB 核心命令
| 命令 | 简写 | 作用 |
|---|---|---|
gdb 程序 |
--- | 启动调试 |
list |
l |
显示源码 |
break |
b |
设置断点 |
info breakpoints |
i b |
查看断点 |
delete |
d |
删除断点 |
run |
r |
运行程序 |
next |
n |
逐过程(F10) |
step |
s |
逐语句(F11) |
continue |
c |
继续执行 |
quit |
q |
退出 |
4.3 关键点提醒
-
Git 只管理源文件 (
.c,.cpp,.h等),不要提交临时文件(.o,.exe),使用.gitignore过滤。 -
提交信息要规范,便于日后追溯。
-
调试前必须加
-g编译,否则 GDB 无法工作。 -
CGDB 比原生 GDB 更友好,推荐使用。














