Linux 开发工具:Git 版本控制与 GDB 调试入门

本文为 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 上修改后推送时,会因为远端已有新提交而拒绝推送(冲突)。

解决步骤

  1. 在 Windows 上先执行 git pull,将远端的新代码拉取到本地。

  2. Git 会自动合并,如果合并失败(同一行都被修改),需要手动编辑冲突文件,删除 <<<<<<<, =======, >>>>>>> 标记,保留正确内容。

  3. 再次 git addgit commitgit 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 可执行程序

退出:quitq

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 更友好,推荐使用。

相关推荐
敲上瘾2 小时前
Docker核心要点和指令速通
linux·运维·docker·容器
zhixingheyi_tian2 小时前
Hadoop 之 native 库
大数据·linux·hadoop·分布式
米饭不加菜2 小时前
PLC编程基础知识
运维·服务器
Soari2 小时前
Ziggo-Device软件构建(On device)教程
运维·服务器·bash·tsn 交换机
倔强的胖蚂蚁2 小时前
Gemma4 优势与 Ollama 更新
运维·云原生
阿洛学长2 小时前
Hexo+Qexo全自动化博客搭建教程
运维·自动化
A-刘晨阳2 小时前
Kubernetes 部署 MySQL 一主两从集群(StatefulSet + Job 初始化主从复制)
运维·mysql·adb·kubernetes·主从复制
HoneyMoose2 小时前
Jenkins pipeline 构建提示 packageManager 配置
运维·jenkins
某人辛木2 小时前
Git推送到GitHub仓库遇到的问题
git·github