【Linux 开发工具链:Git 版本控制 + GDB 调试一篇搞定】

文章目录
前言
你是不是也有过这些经历?
- 代码改着改着,想回退到昨天的版本,却发现回不去了
- 多人协作时,代码被覆盖,不知道谁改的
- 程序崩溃了,但不知道哪里出问题,只能疯狂
printf
如果你点头了,那这篇文章就是为你准备的。我们把 Git(版本控制)和 GDB(调试工具)这两个开发必备工具,一次性讲透。
🍔 比喻:Git 像代码的时光机,可以随时回到过去;GDB 像程序的CT机,能透视程序运行时的一切。
第一部分:Git —— 代码的时光机
一、Git 是什么?
| 概念 | 本质 | 说明 |
|---|---|---|
| Git | 底层版本控制软件 | 分布式、去中心化 |
| GitHub / Gitee | 基于 Git 的网站平台 | 托管代码、协作开发 |
💡 打个比方:Git 就像快递物流系统(底层技术),GitHub/Gitee 就像菜鸟驿站/快递网点(可视化平台)。
1.1 什么是分布式版本控制?
| 特性 | 中心化(SVN) | 分布式(Git) |
|---|---|---|
| 仓库位置 | 只有一个中央仓库 | 每个人电脑上都有完整仓库 |
| 网络要求 | 必须联网才能提交 | 离线也能提交(有网时推送) |
| 安全性 | 中央仓库坏了,数据可能全丢 | 每台电脑都是备份,坏一台还有无数台 |
🎯 Git 的核心特点:去中心化,每个人都是完整仓库,不依赖中央服务器。
二、Git 的安装
2.1 Ubuntu / Debian
sudo apt update
sudo apt install git -y
2.2 CentOS / RHEL
sudo yum install git -y
# 或
sudo dnf install git -y
2.3 Windows
- 访问 https://git-scm.com/download/win
- 下载安装包,一路下一步
- 安装完成后,右键菜单会出现 Git Bash
2.4 macOS
brew install git
# 或
xcode-select --install
2.5 验证安装
git --version
# 输出示例:git version 2.34.1
2.6 初次配置(必须)
# 设置用户名和邮箱(每次提交都会记录)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
# 查看配置
git config --list
三、Git 的核心原理
3.1 Git 只提交变化的部分
Git 不是每次提交都复制整个文件,而是只记录修改的部分。这就像写日记:你只记录今天新增的内容,而不是把整本日记重新抄一遍。
# 第一次提交:记录整个文件
# 第二次提交:只记录改动的那几行
3.2 Git 管理什么?
| 文件类型 | 是否管理 | 说明 |
|---|---|---|
源文件(.c、.h、.cpp、.py) |
✅ 管理 | 代码文件,核心内容 |
编译产物(.o、.exe、a.out) |
❌ 不管理 | 可以从源码生成,不需要存 |
临时文件(.tmp、log) |
❌ 不管理 | 没意义 |
| 配置文件(含密码) | ❌ 不管理 | 安全考虑 |
💡 原则:只管理源文件,不管理生成的文件和临时文件。
四、Git 基本命令
4.1 核心命令速查表
| 命令 | 作用 | 示例 |
|---|---|---|
git init |
初始化仓库(创建 .git 目录) |
git init |
git add |
添加文件到暂存区 | git add main.c 或 git add . |
git commit |
提交暂存区内容到仓库 | git commit -m "添加了xxx功能" |
git push |
推送到远程仓库 | git push origin main |
git pull |
拉取远程仓库的最新代码 | git pull origin main |
git log |
查看提交历史 | git log --oneline |
git status |
查看当前状态 | git status |
git diff |
查看修改内容 | git diff main.c |
git clone |
克隆远程仓库 | git clone https://github.com/xxx/xxx.git |
4.2 一次完整的提交流程
# 1. 初始化仓库(第一次)
git init
# 2. 添加文件到暂存区
git add main.c
git add . # 添加所有修改的文件
# 3. 提交到本地仓库
git commit -m "首次提交:实现基本功能"
# 4. 关联远程仓库(第一次推送需要)
git remote add origin https://gitee.com/你的用户名/仓库名.git
# 5. 推送到远程仓库
git push -u origin main
4.3 查看历史
# 查看完整历史
git log
# 单行显示历史
git log --oneline
# 图形化显示
git log --oneline --graph
# 查看最近 3 条
git log -3
输出示例:
a1b2c3d (HEAD -> main) 修复了登录bug
e4f5g6h 添加了用户注册功能
i7j8k9l 初始化项目
4.4 查看状态
git status
输出示例:
On branch main
Changes not staged for commit:
modified: main.c
Untracked files:
test.c
no changes added to commit
五、.gitignore —— 忽略不需要的文件
5.1 为什么要用 .gitignore?
有些文件不需要提交到 Git:
· 编译产物(.o、.exe)
· 临时文件(.tmp、log)
· 依赖目录(node_modules、pycache)
· 敏感信息(.env、config.secret)
5.2 创建 .gitignore 文件
touch .gitignore
vim .gitignore
5.3 常用 .gitignore 模板(C/C++ 项目)
# 编译产物
*.o
*.obj
*.exe
*.out
*.app
# 调试文件
*.dSYM/
*.gch
# IDE 配置
.vscode/
.idea/
*.swp
*.swo
# 临时文件
*.tmp
*.log
*.cache
# 依赖目录
node_modules/
__pycache__/
5.4 通用规则写法
| 写法 | 含义 | 示例 |
|---|---|---|
*.o |
忽略所有 .o 文件 |
main.o、test.o |
temp/ |
忽略整个 temp 目录 |
temp/a.txt、temp/b.c |
!keep.o |
不忽略 keep.o(取反) |
用于例外情况 |
*.log |
忽略所有 .log 文件 |
debug.log、error.log |
💡 技巧:.gitignore 应该在项目一开始就创建好,避免误提交不需要的文件。
六、冲突解决
6.1 什么时候会发生冲突?
当你的本地仓库和远程仓库不一致时,git push 会被拒绝,提醒你先同步。
git push
# 错误:remote contains work that you do not have locally
# 提示:先 git pull
6.2 解决步骤
# 1. 先拉取远程最新代码
git pull
# 2. 如果有冲突,手动解决冲突文件
# 冲突文件会显示类似内容:
# <<<<<<< HEAD
# 你的修改
# =======
# 远程的修改
# >>>>>>> origin/main
# 3. 手动编辑文件,删除冲突标记,保留正确代码
# 4. 重新提交
git add .
git commit -m "解决冲突"
git push
🎯 核心原则:远端仓库相对于任何人都是最新的。遇到冲突,说明你的本地需要和远端同步了。
七、常用 Git 工作流
# 每天开始工作
git pull origin main # 拉取最新代码
# 修改代码...
# 提交代码
git add . # 添加修改
git commit -m "描述修改" # 提交到本地
git push origin main # 推送到远程
# 查看历史
git log --oneline --graph
第二部分:GDB —— 程序的 CT 机
一、GDB 是什么?
GDB(GNU Debugger) 是 Linux 下的调试工具,可以让你:
· 设置断点,暂停程序
· 单步执行,逐行看代码
· 查看变量的值
· 查看调用栈
🏥 比喻:GDB 就像医院的 CT 机,能透视程序内部的一切。
二、为什么需要 GDB?
| 调试方式 | 优点 | 缺点 |
|---|---|---|
printf 大法 |
简单、通用 | 需要改代码、重新编译、用完要删 |
| GDB | 不改代码、实时查看、功能强大 | 需要学习命令 |
三、GDB 的安装
3.1 Ubuntu / Debian
sudo apt update
sudo apt install gdb -y
3.2 CentOS / RHEL
sudo yum install gdb -y
# 或
sudo dnf install gdb -y
3.3 验证安装
gdb --version
# 输出示例:GNU gdb (Ubuntu 12.1-0ubuntu1) 12.1
3.4 安装 cgdb(更好的界面)
GDB 默认界面比较原始,推荐安装 cgdb(彩色版 GDB):
sudo apt install cgdb -y # Ubuntu
sudo yum install cgdb -y # CentOS
# 使用
cgdb ./program
💡 cgdb 比原生 GDB 好用太多了,强烈推荐!
四、如何让程序支持调试?
4.1 核心概念
gcc/g++ 默认工作在 release 模式,不包含调试信息,无法用 GDB 调试。
| 模式 | gcc 选项 | 特点 |
|---|---|---|
| release 模式 | 默认 | 体积小、运行快、无法调试 |
| debug 模式 | -g |
体积大、包含调试信息、可以调试 |
4.2 编译带调试信息的程序
# 错误示范(无法调试)
gcc main.c -o main
# 正确示范(可以调试)
gcc -g main.c -o main
# C++ 程序同理
g++ -g main.cpp -o main
4.3 验证是否有调试信息
file main
# 有调试信息会显示:with debug_info, not stripped
# 无调试信息会显示:stripped
五、GDB 基本命令
5.1 启动和退出
| 命令 | 作用 |
|---|---|
gdb ./program |
启动 GDB,加载程序 |
cgdb ./program |
启动 cgdb(推荐) |
q 或 quit |
退出 GDB |
# 启动 GDB
gdb ./main
# 进入 GDB 后的提示符:(gdb)
(gdb) q # 退出
5.2 运行和断点命令
| 命令 | 简写 | 作用 | 示例 |
|---|---|---|---|
run |
r |
运行程序 | r |
break |
b |
设置断点 | b 10(第10行)b main(函数入口) |
info break |
info b |
查看所有断点 | info b |
delete |
d |
删除断点 | d 1(删除编号1的断点) |
disable |
无 | 禁用断点 | disable 1 |
enable |
无 | 启用断点 | enable 1 |
5.3 单步执行命令
| 命令 | 简写 | 作用 | 说明 |
|---|---|---|---|
next |
n |
逐过程 | 不进入函数内部 |
step |
s |
逐语句 | 会进入函数内部 |
continue |
c |
继续运行 | 运行到下一个断点 |
finish |
无 | 跳出当前函数 | 执行完当前函数并返回 |
5.4 查看信息命令
| 命令 | 简写 | 作用 | 示例 |
|---|---|---|---|
print |
p |
打印变量值 | p a、p &a、p *ptr |
display |
无 | 自动显示变量(每次停下都打印) | display a |
list |
l |
查看源代码 | l(当前位置)、l 10(第10行) |
backtrace |
bt |
查看调用栈 | bt |
5.5 命令速查表
| 命令 | 简写 | 作用 |
|---|---|---|
run |
r |
运行 |
break |
b |
打断点 |
info break |
info b |
查看断点 |
delete |
d |
删断点 |
next |
n |
逐过程 |
step |
s |
逐语句 |
continue |
c |
继续 |
print |
p |
打印变量 |
list |
l |
看源码 |
quit |
q |
退出 |
六、GDB 实战示例
6.1 示例代码
// test.c
#include <stdio.h>
int add(int a, int b) {
int result = a + b;
return result;
}
int main() {
int x = 10;
int y = 20;
int sum = add(x, y);
printf("sum = %d\n", sum);
return 0;
}
6.2 编译并启动调试
# 编译(记得加 -g)
gcc -g test.c -o test
# 启动 GDB
gdb ./test
6.3 调试过程
# 1. 查看源码
(gdb) l
1 #include <stdio.h>
2
3 int add(int a, int b) {
4 int result = a + b;
5 return result;
6 }
7
8 int main() {
9 int x = 10;
10 int y = 20;
# 2. 在第 9 行设置断点
(gdb) b 9
Breakpoint 1 at 0x1149: file test.c, line 9.
# 3. 运行程序
(gdb) r
Starting program: ./test
Breakpoint 1, main () at test.c:9
9 int x = 10;
# 4. 单步执行
(gdb) n
10 int y = 20;
(gdb) n
11 int sum = add(x, y);
# 5. 进入函数内部
(gdb) s
add (a=10, b=20) at test.c:4
4 int result = a + b;
# 6. 查看变量
(gdb) p a
$1 = 10
(gdb) p b
$2 = 20
# 7. 继续执行
(gdb) n
5 return result;
(gdb) p result
$3 = 30
# 8. 继续运行到结束
(gdb) c
Continuing.
sum = 30
[Inferior 1 (process 12345) exited normally]
# 9. 退出
(gdb) q
七、GDB 高级技巧
7.1 条件断点
# 当 i == 10 时才停下
(gdb) b 15 if i == 10
7.2 观察点(Watchpoint)
# 当变量被修改时停下
(gdb) watch x
7.3 打印复杂类型
# 打印数组
(gdb) p *array@10 # 打印前10个元素
# 打印结构体
(gdb) p *ptr # 打印指针指向的结构体
(gdb) p struct_var # 打印结构体变量
八、解决 GDB 难用的问题
8.1 原生 GDB 的痛点
· 没有代码高亮
· 界面不够友好
· 命令太多记不住
8.2 解决方案:cgdb
cgdb 是 GDB 的彩色界面增强版,左侧显示代码,右侧输入命令。
| 特性 | GDB | cgdb |
|---|---|---|
| 代码高亮 | ❌ | ✅ |
| 分屏显示 | ❌ | ✅(代码+命令) |
| 键盘友好 | ❌ | ✅ |
| 学习成本 | 高 | 低 |
8.3 cgdb 安装和使用
# 安装
sudo apt install cgdb -y # Ubuntu
sudo yum install cgdb -y # CentOS
# 使用(和 GDB 命令完全一样)
cgdb ./program
8.4 cgdb 快捷键
| 快捷键 | 作用 |
|---|---|
ESC |
切换到代码窗口 |
i |
切换到命令窗口 |
j/k |
上下移动 |
g |
回到代码开头 |
G |
跳到代码末尾 |
q |
退出 |
🎯 强烈建议直接用 cgdb,体验提升巨大!
总结速查表
| 知识点 | 核心内容 |
|---|---|
| Git 本质 | 分布式版本控制,只记录变化 |
| Git 安装 | sudo apt install git |
| Git 三连 | add → commit → push |
.gitignore |
忽略编译产物、临时文件、敏感配置 |
| 冲突解决 | 先 pull,解冲突,再 push |
| GDB 前置 | 编译必须加 -g 选项 |
| GDB 核心命令 | b、r、n、s、p、c、q |
| cgdb | GDB 的彩色版,强烈推荐 |
| debug vs release | debug 可调,release 不可调 |
最后
这两把工具是 Linux 开发的必备技能:
· Git:代码的时光机,不怕改错,不怕丢失
· GDB:程序的 CT 机,bug 无处遁形
建议你跟着文章把命令敲一遍,遇到问题欢迎留言交流。
更多推荐




所有评论(0)