在这里插入图片描述


前言

你是不是也有过这些经历?

  • 代码改着改着,想回退到昨天的版本,却发现回不去了
  • 多人协作时,代码被覆盖,不知道谁改的
  • 程序崩溃了,但不知道哪里出问题,只能疯狂 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

  1. 访问 https://git-scm.com/download/win
  2. 下载安装包,一路下一步
  3. 安装完成后,右键菜单会出现 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.exea.out ❌ 不管理 可以从源码生成,不需要存
临时文件(.tmplog ❌ 不管理 没意义
配置文件(含密码) ❌ 不管理 安全考虑

💡 原则:只管理源文件,不管理生成的文件和临时文件。


四、Git 基本命令

4.1 核心命令速查表

命令 作用 示例
git init 初始化仓库(创建 .git 目录) git init
git add 添加文件到暂存区 git add main.cgit 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.otest.o
temp/ 忽略整个 temp 目录 temp/a.txttemp/b.c
!keep.o 不忽略 keep.o(取反) 用于例外情况
*.log 忽略所有 .log 文件 debug.logerror.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(推荐)
qquit 退出 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 ap &ap *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 三连 addcommitpush
.gitignore 忽略编译产物、临时文件、敏感配置
冲突解决 pull,解冲突,再 push
GDB 前置 编译必须加 -g 选项
GDB 核心命令 brnspcq
cgdb GDB 的彩色版,强烈推荐
debug vs release debug 可调,release 不可调

最后

这两把工具是 Linux 开发的必备技能:

· Git:代码的时光机,不怕改错,不怕丢失
· GDB:程序的 CT 机,bug 无处遁形

建议你跟着文章把命令敲一遍,遇到问题欢迎留言交流。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐