【Linux】Linux开发必备:Git版本控制与GDB调试全指南

前言:在Linux开发流程中,版本控制与程序调试是保障项目稳定性和开发效率的两大核心环节。Git作为当前最主流的分布式版本控制系统,能高效管理代码迭代、追踪修改记录并支持多人协同开发;GDB(GNU调试器)是Linux下调试C/C++程序的利器,可帮助开发者定位代码逻辑错误、跟踪变量变化,快速排查运行时问题。本文将从实战角度出发,详细拆解GIt的核心操作与GBDB的调试技巧。

一、Git:从基础到实践的版本控制

1.1为什么需要版本控制?

  • 版本控制的价值:记录代码每一次修改(谁改、改了什么、什么时候改),支持一键回滚到历史版本,实现多人并行开发时的代码同步与冲突解决
  • 对比传统“复制副本”方式:告别 “项目 - v1.doc”“项目 - 最终版 2.doc” 的混乱命名,用 Git 统一管理版本,减少冗余文件

1.2 Git简史:从Linux内核开发需求诞生的工具

  • 背景:2005年,Linux内核开发团队因商业版本控制系统BitKeeper终止授权,由Linus Torvalds主导开发Git
  • 核心设计目标:
    1. 速度快:高效处理超大规模项目(如Linux内核,百万级代码量)
    2. 完全分布式:无需依赖中央服务器,本地可完成版本管理,联网后同步即可
    3. 支持非线性开发:轻松创建、合并分支,满足多人并行开发需求

1.3Git环境搭建:Linux下的安装和初始化配置

(1)在Linux安装Git(以Centos/Ubuntu为例)
  • Centos系统:
     //1.先下载gitsudo yum install git//2.再查看git版本,确认是否下载下来了git --version
  • Ubuntu系统:
sudo apt install git -ygit --version
(2)在github/gitee创建项目(下面以gitee为例)
  • 注册账号:按照网站提示写即可
    在这里插入图片描述

  • 创建仓库:

    1. 登录成功后,进入个人主页,在右上方➕按钮,点击新建仓库
      在这里插入图片描述

    2. 跳转到新页面输入项目名称及其他设置:
      在这里插入图片描述

    3. 创建完后,在创建好的仓库页面中复制仓库链接,以备接下来进行下载:
      在这里插入图片描述

(3)将仓库克隆到Linux下
  • 创建一个放置代码的目录(往后的要提交到远程仓库的代码最好放在这个目录下
git clone [url]//url就是上一步复制的仓库链接

在这里插入图片描述

  • Git“三板斧”–提交代码到远程仓库:
操作步骤命令作用示例
1.暂存代码git add 文件名将修改的文件加入 “暂存区”,标记为待提交状态暂存单个文件:git add main.c;暂存所有修改:git add .
2.本地提交git commit -m "提交说明"(提交说明一定要有,即使不写,也要写上双引号)将暂存区的修改提交到 “本地仓库”,并添加说明(必须写清楚修改内容)git commit -m “修复main函数中的逻辑错误,添加参数校验”
3.远程同步git push将本地仓库的提交同步到远程 Gitee 仓库执行后输入 Gitee用户名和密码
(4)首次使用配置:设置用户信息(关键!!!)

Git需要知道提交者的姓名和邮箱,用于标记每一次代码的归属,配置命令如下:

# 全局配置(对当前用户所有Git仓库生效) 
git config --global user.name "你的姓名" # 如"Zhang San" 
git config --global user.email "你的邮箱" # 如"zhangsan@example.com" # 查看配置是否生效 
git config --list # 输出中应包含user.name和user.email的配置

在这里插入图片描述

(5)常用辅助命令:查看状态与历史
  • 查看当前代码修改状态:git status(显示哪些文件被修改、哪些被暂存)
  • 查看提交历史:git log(显示所有提交记录)
  • 拉取远程仓库最新代码:git pull(建议先拉取再提交,避免冲突)

1.4 进阶技巧:.gitignore忽略文件与免密提交

(1).gitignore:忽略无需版本控制的文件

有些文件(如编译生成的.o文件、可执行文件、日志文件)无需纳入 Git 管理,可通过创建.gitignore文件指定忽略规则:
1. 在仓库根目录创建.gitignore:

       vim .gitignore

2.写入忽略规则(示例):

     # 忽略所有.o文件 *.o # 忽略可执行文件(如main) main # 忽略日志目录 log/

在这里插入图片描述

3.提交.gitignore到仓库(同代码提交步骤)

      git add .gitignore git commit -m "添加.gitignore,忽略编译产物和日志" git push
(2)配置免密提交:避免每次push输入账号密码
方法一:SSH密钥
  • 步骤一:检查本地是否已存在SSH密钥,执行命令:
ls -la ~/.ssh/

若输入中包括id_rsa(私钥)和id_rsa.pub(公钥),即已存在密钥,直接跳到步骤三;若无,继续第二步

  • 步骤二:执行以下命令生成RSA类型的SSH密钥,过程中无需输入复杂密码(按3次回车键即可)
  ssh-keygen -t rsa -C "你的 Gitee 绑定邮箱" # 替换为你注册 Gitee 时用的邮箱

输出示例:
在这里插入图片描述

  • 步骤三:查看并复制SSH公钥,执行以下命令
   cat ~/.ssh_rsa.pub/

如下,复制密钥即可:
在这里插入图片描述

  • 步骤四:在gitee上配置 SSH公钥
    1. 登录Gitee账号,点击右上角设置

    2. 在左侧菜单找到安全->SSH公钥,点击添加公钥,如下
      在这里插入图片描述

    3. 点击确定,并验证账号密码,完成公钥配置。

  • 步骤五:验证SSH连接并修改仓库远程地址
  1. 执行如下命令:
 ssh -T git@gitee.com

在这里插入图片描述

  1. 查看当前远程地址(确认是否是HTTPS格式)
    git remote -v

若输出含https://gitee.com/...,不包括你的用户名和仓库名,需要进行下一步修改;

  1. 修改远程地址为SSH格式:
    git remote set-url origin git@gitee.com:你的用户名/你的仓库名.git 
  1. 验证修改结果:
    git remote -v

输出如下效果即成功:
在这里插入图片描述

  • 步骤六:测试免密码提交
    执行git push提交代码,此时无需输入账号密码,直接完成同步(首次使用SSH可能需要确认密钥,后续永久免密)

在这里插入图片描述

方法二:系统配置
  • 步骤一:在根目录创建文件.git-credentials,并进入文件,输入内容plaintext https://{username}:{password}@github.com
cd ~ 
touch .git-credentials 
vim .git-credentials 
https://{username}:{password}@github.com  //username即用户名,password即用户密码
  • 步骤二:在终端输入以下命令
git config --global credential.helper store
  • 步骤三:打开~/.gitconfig文件,会发现多了一项
[credential] 
helper = store

在这里插入图片描述

  • 步骤四:测试免密提交,执行git push提交代码,此时无需输入账号密码,直接完成同步(与法一效果相同)

二、GDB:Linux下的C/C++程序调试利器

2.1调试前准备:编译时添加-g选项(生成调试信息)

  • 程序的发布方式有两种,debug模式和release模式,Linux下用gcc/g++编译程序时,默认是release模式(无调试信息,无法用GDB调试),需添加-g选项开启debug模式:
//编译test1.c,生成带调试信息的可执行文件test1
gcc test1.c -o test1 -g//查看调试信息
gdb test1

在这里插入图片描述

2.2 GDB基础操作:启动、退出与核心调试命令

(1)启动与退出GDB
  • 启动GDB:gdb 可执行文件名(如上图),进入GDB交互页面(提示符为gdb
  • 退出GDB:输入quit或ctrl+d
(2)GDB基础命令
命令作用样例
list(l) 行号或函数名或文件名:行号显示源代码,从上次位置开始列出n行或指定函数的源代码或指定文件的源代码list 10或mian或test1.c:2
run®从程序开始连续执行run®
next(n)单步执行,不进入函数内部next(n)
step(s)单步执行,且进入函数内部step(s)
break(b) 文件名:(可省略)行号或函数名在指定行数设置断点或在函数开头设置断点break test1.c:10或main
info(i) break(b)/breakpoints查看当前所有断点信息/断点列表info b/breakpoints
info(i) locals查看当前栈的局部信息(查看临时变量)info locals
finish执行到当前函数返回,然后停止finish
print§ 表达式/变量打印表达式的值/指定给变量的值print a+b/x
set var 变量=值修改变量的值set var i=10
delete(d) breakpoints -/序号n(可省略)删除所有断点/删除序号为n的断点d breakpoints 1
disable/enable breakpoints禁用/启用所有断点disable/enable breakpoints
display 变量名跟踪显示指定变量的值(每次停止)display x
undisplay 编号取消对指定编号变量的跟踪undisplay x
backtrace(bt)查看当前执行栈的各级函数条用及参数bt
quit(q)退出GDB调试器q

2.3 GDB进阶技巧:监视变量、条件断点与栈帧查看

示例代码sum.c:

#include <stdio.h>// 求和函数:计算s到e的累加和
int Sum(int s, int e) {int result = 0;for (int i = s; i <= e; i++) {result += i;}return result;
}int main() {int start = 1;int end = 100;int total = Sum(start, end);printf("1到100的和:%d\n", total);return 0;
}
(1)watch:监视变量的变化(变量修改时自动断点)

示例:
在这里插入图片描述

(2)条件断点:满足特定条件才触发断点

当循环次数较多(如100次),只想在某一次循环(如i=50)时断点,用条件断点:

  • 方式一:新增断点时直接加条件:b 行号 if 条件
(gdb) b 6 if i == 50 # 在第6行(result += i)设断点,仅当i=50时触发 
Breakpoint 3 at 0x40052a: file sum.c, line 6.
  • 方式二:给已有断点追加条件:condition 断点编号 条件
(gdb) b 6 # 先设普通断点(编号假设为3) 
(gdb) condition 3 i == 50 # 给3号断点加条件 
(gdb) info b # 查看断点,会显示“stop only if i == 50”

在这里插入图片描述

(3)栈帧查看:bt 与info locals 定位函数调用链

当程序崩溃或执行到深层函数时,用bt(backtrace)查看函数调用栈,用info locals查看当前函数的局部变量:

在这里插入图片描述

2.4 优化调试体验:安装cgdb(代码分屏的GDB)

默认 GDB 为纯命令行界面,无法同时显示代码和调试命令,cgdb是 GDB 的增强工具,支持 “代码分屏”:

  • 安装:(centos/Ubuntu)
#Centos
sudo yum install cgdb -y#Ubuntu
sudo apt install cgdb -y
  • 使用:cgdb 可执行文件名(如cgdb sum),界面分为上下两部分:上半部分显示源代码,下半部分显示GDB命令行
  • 快捷键:按ESC切换到代码区(可用方向键滚动代码),按i切换回命令行
    效果如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97838.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现 TypeScript 内置工具类型(源码解析与实现)

目标读者&#xff1a;已经熟悉 TypeScript 基础语法、泛型、条件类型的同学。本文按常见工具类型的分类与顺序实现并解释 Partial、Required、Readonly、Pick、Omit、Record、Exclude、Extract、NonNullable、ReturnType、Parameters、ConstructorParameters、InstanceType、Th…

Spring Boot + Nacos 配置中心示例工程

1️⃣ 工程结构 nacos-demo├── pom.xml└── src├── main│ ├── java│ │ └── com.example.nacosdemo│ │ ├── NacosDemoApplication.java│ │ ├── config│ │ │ └── AppProperties.java│ │ └── cont…

(二)文件管理-基础命令-pwd命令的使用

文章目录1. 命令格式2. 基本用法3. 高级用法4. 注意事项1. 命令格式 pwd [OPTION]...[OPTION]: 可选选项&#xff0c;用于改变命令的默认行为。最主要的两个选项是 -L 和 -P。它不需要任何参数&#xff08;如文件名或目录名&#xff09; 2. 基本用法 用法&#xff1a;pwd 是…

Leetcode_202.快乐数_三种方法解决(普通方法解决,哈希表解决,循环链表的性质解决_快慢指针)

目录第一种方法&#xff1a;暴力解法暴力ac代码&#xff1a;第二种方法&#xff1a;哈希表哈希表ac代码:第三种方法&#xff1a;根据循环链表的性质(快慢指针)第一种方法&#xff1a;暴力解法 最暴力的思路就是直接使用循环往下一直计算&#xff0c;这样特别浪费时间&#xff…

代码随想录刷题Day48

这次博客主要是对做过的关于二叉树系列的题目进行整理和分类。二叉树&#xff0c;要处理整个树&#xff0c;一般少不了遍历。遍历主要可以分为&#xff1a;递归系列、层序遍历。如果不遍历的话&#xff0c;那就是处理特殊的树了&#xff0c;比如完全二叉树。递归系列基本的递归…

汽车工装结构件3D扫描尺寸测量公差比对-中科米堆CASAIM

汽车制造过程中&#xff0c;工装结构件的尺寸精度对整车装配质量和生产进度有重要影响。传统测量工具如卡尺和三坐标测量机采用接触式工作方式&#xff0c;检测过程耗时较长&#xff0c;对于具有复杂曲面特征的工件&#xff0c;难以全面获取尺寸数据。激光三维扫描技术改变了传…

Docker Pull 代理配置方法

本文介绍通过网络代理加速Docker镜像拉取的方法。 配置方法 当执行docker pull从Docker Hub 拉取镜像时&#xff0c;其网络连接由守护进程docker daemon进行维护。 要修改其代理设置&#xff0c;可配置其systemd服务&#xff0c;步骤如下&#xff1a; &#xff08;1&#xf…

机电装置:从基础原理到前沿应用的全方位解析

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 机电装置的基本概念与发展历程 机电装置&#xff08;Mechatronic D…

《SVA断言系统学习之路》【03】关于布尔表达式

序列中使用的表达式基于其所含变量的采样值进行评估。表达式评估的结果为布尔值&#xff0c;其解释方式与过程性if语句条件中的表达式完全相同&#xff1a;若表达式计算结果为X、Z 或 0&#xff0c;则被解释为假&#xff1b;否则即为真。但是&#xff0c;对可出现在并发断言中的…

指针高级(2)

6.数组指针#include <stdio.h> int main() {/*练习&#xff1a;利用指针遍历数组*///1.定义数组int arr[] { 10,20,30,40,50 };int len sizeof(arr) / sizeof(int);//2.获取数组的指针//实际上获取的&#xff1a;数组的首地址int* p1 arr;int* p2 &arr[0];printf…

如何高效记单词之:抓住首字母——以find、fund、fond、font为例

find、fund、fond、font这几个单词&#xff0c;你都认识吗&#xff1f;这几个单词&#xff0c;意思大体如下&#xff1a; find v.找到&#xff1b;发现fund n.基金fond a.喜欢的&#xff1b;喜爱的&#xff1b;深情的font n.字体&#xff0c;字型&#xff0c;字形 这几个单词在…

Ubuntu下把 SD 卡格式化为 FAT32

在 Ubuntu 下把 SD 卡格式化为 FAT32&#xff0c;按下面做&#xff08;会抹掉整卡数据⚠️&#xff09;&#xff1a; 1) 找到你的 SD 卡设备名 lsblk -p记下整盘设备&#xff0c;比如 /dev/sdb&#xff08;USB 读卡器常见&#xff09;或 /dev/mmcblk0&#xff08;内置读卡器&am…

涉私数据安全与可控匿名化利用机制研究(上)

文章目录前言一、涉私数据的概述及分类&#xff08;一&#xff09;涉私数据的“知情同意原则”&#xff08;二&#xff09;涉私数据的分类二、涉私数据可控匿名化利用机制&#xff08;一&#xff09;数据产品与涉私数据的利用形式&#xff08;二&#xff09;通过可信数据空间受…

Redis 的跳跃表:像商场多层导航系统一样的有序结构

目录 一 、从 "超市货架" 的痛点看跳跃表的价值 1.1、跳跃表与商场导航系统的结构对应 1. 1.1、zskiplistNode&#xff1a;带导航标记的 "商品"&#xff08;跳跃表节点&#xff09; 1.1.1.1、level []&#xff1a;商品上的多层导航标记 1.1.1.2、back…

小程序点击之数据绑定

<return /><view class"all-wrap" style"padding-top:{{topHeight}}px;"><view class"my-title">我的收藏</view><scroll-viewclass"collect-list-container"scroll-yscroll-top"{{scrollTop}}"…

数据结构——顺序表和单向链表(2)

目录 前言 一、单向链表 1、基本概念 2、单向链表的设计 &#xff08;1&#xff09;节点设计 &#xff08;2&#xff09;初始化空单向链表 &#xff08;3&#xff09;、初始化数据节点 &#xff08;4&#xff09;数据节点 &#xff08;5&#xff09;判断链表是否为空 …

More Effective C++ 条款26:限制某个类所能产生的对象数量

More Effective C 条款26&#xff1a;限制某个类所能产生的对象数量核心思想&#xff1a;通过控制类的实例化过程&#xff0c;限制程序中该类的对象数量&#xff0c;可以防止资源过度使用&#xff0c;确保系统资源合理分配&#xff0c;并实现单例或有限实例模式。 &#x1f680…

CMS系统维护中常见的安全威胁及防护指南!

内容管理系统&#xff08;CMS&#xff09;已成为网站建设的核心工具&#xff0c;但随之而来的安全风险却常被低估。超过70%的网站使用CMS构建&#xff0c;而其中近半数曾遭遇安全漏洞威胁。作为运维人员和开发者&#xff0c;了解这些安全威胁并采取相应防护措施至关重要。 一、…

springboot knife4j 接口文档入门与实战

Spring Boot3 Knife4j 项目地址https://gitee.com/supervol/loong-springboot-study&#xff08;记得给个start&#xff0c;感谢&#xff09;Knife4j 介绍在国内 Java 开发领域&#xff0c;Knife4j 是一款广受欢迎的 API 文档工具&#xff0c;它基于 OpenAPI 规范&#xff0c;在…

Spring Boot 事务失效的八大原因及解决方案详解

在 Spring Boot 项目开发中&#xff0c;声明式事务管理通过 Transactional 注解提供了极大的便利。但许多开发者都曾遇到过事务不生效的困扰。本文将详细分析导致 Spring Boot 事务失效的八大常见情况&#xff0c;并提供相应的解决方案。1. 数据库引擎不支持事务问题分析&#…