【Linux】聊聊程序员必备的两个工具:Git版本控制和GDB调试
平时写代码的时候,你有没有过这种困扰?改了好几版代码,最后发现还是第一版好用,结果旧版本早就被覆盖没了;或者跟同事一起写项目,两个人改了同一个文件,合并的时候一团乱麻;再或者代码跑不起来,不知道哪里错了,只能一遍遍加printf打印?
其实解决这些问题,就靠两个常用工具:Git(版本控制) 和 GDB(调试器)。今天就用大白话跟大家聊聊这俩工具,从基础概念到实际操作,新手也能看明白。
一、先搞懂版本控制:你就是自己代码的“时光机”
先从一个大家都经历过的场景说起——交作业。
比如老师让交论文,你改了4版:第一版写得中规中矩,第二版加了点内容,第三版删了些段落,第四版改到自己都看不下去。结果老师说“还是第一版好,用第一版吧”。这时候就分两种情况:
- 同学A:每次改都直接在原文件上改,改完就保存,现在想找第一版?早没了,只能哭着重写;
- 同学B:每次改完都新建一个文件夹,比如“论文V1”“论文V2”,清清楚楚,打开“论文V1”直接交就行。
同学B的做法,其实就是版本控制——把文件的每一次修改都记录下来,需要的时候能随时找回旧版本。
而Git,就是用来做这件事的专业工具,而且比“建文件夹”强太多了:它能记录每一次修改的内容、修改人、修改时间,还能多人协作不冲突。
二、Git、Gitee、GitHub:别搞混了!
很多新手刚接触会懵:Git、Gitee、GitHub到底啥关系?其实很简单,用一句话总结:
Git是“工具”,Gitee/GitHub是“存放代码的平台”。
就像你用Word(工具)写文档,写完可以存在百度云(平台)或者本地硬盘(本地仓库)里。Git就是那个“Word”,负责管理版本;Gitee(国内平台,访问快)和GitHub(国际平台,资源多)就是“百度云”,负责把你本地的代码存到网上,方便自己备份、或者跟别人共享协作。
放张关系图理解更清楚(对应你原文里的图):
Git(本地版本控制工具)可以连接Gitee/GitHub(远端仓库),你本地改完代码,能传到远端;别人改了,你也能从远端拉取到自己电脑上,实现协作。
另外Git还有个特点:去中心化的分布式控制。不是说所有代码都存在一个中央服务器(比如只有Gitee上有),而是每个用Git的人,电脑上都有完整的代码仓库。比如你和同事协作,不用必须通过远端,直接从对方电脑拉取代码也能同步,灵活很多。
三、Git的小历史:为啥会有Git?
早年间,程序员用的版本控制工具(比如BitKeeper)很多是收费的,而且用着不自由。2005年的时候,Linux内核的开发者(比如Linus Torvalds,Linux的创始人)觉得 existing 工具不好用,干脆自己动手,花了一两周时间写了Git的雏形。
后来Git开源了,大家越用越觉得方便,慢慢就成了程序员圈子里的“标配”——现在不管是个人项目还是公司开发,基本都用Git做版本控制。
四、Git入门:学会“三板斧”,基本够用了
Git的命令不少,但新手先掌握“三板斧”(add、commit、push),再加上几个常用命令,日常管理代码就没问题了。先从最基础的操作说起:
1. 第一步:安装Git,配置身份
首先得在电脑上装Git:
- 如果你用的是CentOS/RHEL系统,打开终端输:
yum install git
- 如果你用的是Ubuntu/Debian系统,输:
apt install -y git
- 装完后验证一下:输
git --version
,能显示版本号就说明装好了。
第一次用Git,必须配置用户名和邮箱——因为Git要知道“谁改了代码”,不然提交的时候会报错。配置命令如下(把括号里的换成你自己的信息):
git config --global user.name "你的用户名" # 比如 "ZhangSan"
git config --global user.email "你的邮箱" # 比如 "zhangsan@xxx.com"
2. 核心概念:本地仓库和暂存区
用Git管理代码,会涉及两个关键地方:
- 本地仓库:就是你电脑上的
.git
文件夹(隐藏的,用tree .git
能看到里面的结构),所有版本记录都存在这里; - 暂存区:可以理解成“临时中转站”,你改了文件,不是直接进仓库,而是先放到暂存区,确认没问题了再提交到仓库。
为什么要暂存区?比如你改了3个文件,其中2个改完了,1个还没改好。这时候可以先把改好的2个放到暂存区,提交到仓库;没改好的那个先不放,等改完再单独提交,灵活很多。
3. Git“三板斧”操作流程
假设你新建了一个项目文件夹,想用法Git管理,步骤是这样的:
(1)初始化本地仓库
进入项目文件夹,输命令:git init
执行完会生成一个.git
隐藏文件夹,说明这个文件夹已经被Git管理了。
(2)第一斧:git add —— 把文件放到暂存区
比如你新建了一个test.c
文件,想把它加入版本控制,输:
git add test.c
如果想把当前文件夹里所有改了的文件都加入暂存区,输:git add .
(注意后面有个点)。
想看看哪些文件在暂存区、哪些没在?输git status
就行,终端会显示得明明白白(对应你原文里的status截图):比如“已暂存的文件”会标绿色,“未暂存的文件”标红色。
如果不小心加错了文件到暂存区,想删掉?输git reset 文件名
就能把这个文件从暂存区撤出来。
(3)第二斧:git commit —— 把暂存区的文件提交到本地仓库
暂存区确认没问题了,就可以提交到本地仓库,相当于“保存一个版本”。命令是:
git commit -m "这里写版本说明"
重点:-m
后面的“版本说明”千万别瞎写!比如你改了什么,就写“新增test.c文件”“修复登录bug”“优化首页加载速度”,这样以后看日志的时候,能一眼知道这个版本改了啥。
提交完想看看历史版本?输git log
,就能看到所有commit记录:每个版本的ID、提交人、时间、说明都有。
(4)第三斧:git push —— 把本地仓库的代码推到远端(Gitee/GitHub)
本地保存了版本,想传到Gitee/GitHub备份或协作,就用git push
。不过第一次推之前,要先把本地仓库和远端仓库关联(比如在Gitee新建一个仓库,然后按Gitee的提示,用git remote add origin 仓库链接
关联),关联好后再推,代码就到远端了。
4. 其他常用命令:解决“突发情况”
- 不小心删了本地仓库? 别慌!如果之前推过远端,直接用
git clone 远端仓库链接
,就能把远端的代码完整拉取到本地,相当于重新恢复了仓库。 - Git只管理“源文件”:比如你用C语言编译生成的
.obj
文件、.exe
文件,或者日志文件、缓存文件,这些不是代码本身,没必要加入版本控制。这时候就需要一个.gitignore
文件——在项目根目录新建这个文件,里面写你想忽略的文件后缀(比如*.obj
、*.exe
、log/
),Git就会自动过滤这些文件,不会让你提交它们(对应你原文里的.gitignore截图)。
五、遇到代码冲突?别慌,这样解决
多人协作的时候,最容易遇到的问题就是“冲突”:比如你和同事都改了同一个文件的同一行代码,你先把代码推到远端,同事再推的时候,Git就会提示“冲突”,推不上去。
这时候别慌,解决步骤很简单:
- 先输
git pull
,把远端最新的代码(包括你刚推的)拉取到自己本地; - 拉取后,Git会在冲突的文件里标注出冲突的地方(比如用
<<<<<<<
、=======
、>>>>>>>
分隔你的代码和远端的代码); - 打开这个文件,手动修改冲突部分(比如保留正确的代码,删掉冲突标记);
- 修改完后,再用
git add 冲突文件
→git commit -m "解决xxx文件冲突"
→git push
,就能推上去了。
核心原则:先拉取,再解决冲突,最后提交推送。
六、聊完版本控制,再说说调试:GDB调试器
写代码难免会遇到bug:比如程序崩溃、结果不对,但不知道问题出在哪。这时候总不能靠printf一遍遍试吧?效率太低了。GDB就是用来解决这个问题的——它是一个命令行调试器,能让程序“一步步跑”,还能看变量的值、设断点,帮你快速定位bug。
1. 先搞懂:程序的两个版本——release和debug
用GDB调试有个前提:你的程序必须是“debug版本”,不能是“release版本”。这俩有啥区别?
-
release版本:是最终发布给用户用的版本,编译器(比如gcc/g++)会自动优化代码(比如删去无用的代码、压缩体积),而且不会保留调试信息。所以你用gcc默认编译的程序,就是release版本,比如
gcc test.c -o test
,这种程序没法用GDB调试(对应你原文里的release截图)。 -
debug版本:是给开发者调试用的版本,编译的时候要加
-g
参数,编译器会保留调试信息(比如代码行号、变量信息),所以文件体积会比release大一点,但能被GDB识别。比如编译命令要写成:gcc test.c -o test -g
(对应你原文里的debug截图)。
记住:想调试,编译时一定要加-g
!
2. GDB基础命令:入门够用了
GDB是命令行工具,打开方式很简单:终端输gdb 你的程序名
,比如gdb test
,就能进入GDB调试环境。下面是几个最常用的命令(记不住可以先存着,用的时候查):
命令 | 作用 | 例子 |
---|---|---|
l (list) |
查看代码(默认显示10行,再输l 会继续往下显示) |
l 或 l 10 (查看第10行附近的代码) |
r (run) |
运行程序(如果没设断点,会直接跑完) | r |
b (break) |
设置断点(让程序在指定位置停下来) | b 15 (在第15行设断点)、b main (在main函数开头设断点) |
info b |
查看所有断点(会显示断点编号、位置) | info b |
d (delete) |
删除断点 | d 1 (删除编号为1的断点) |
n (next) |
单步执行(不进入函数内部,像“下一步”) | n |
s (step) |
单步执行(会进入函数内部,像“步入”) | s |
p (print) |
查看变量的值 | p a (查看变量a的值) |
quit |
退出GDB调试环境 | quit |
举个简单的调试例子:
你编译了debug版本的test
程序,想在第20行设断点,查看变量sum
的值:
- 终端输
gdb test
→ 进入GDB; - 输
b 20
→ 在第20行设断点; - 输
r
→ 运行程序,程序会在第20行停下来; - 输
p sum
→ 查看当前sum
的值; - 输
n
→ 执行下一行代码,再输p sum
,看sum
有没有变化; - 调试完输
quit
退出。
3. GDB命令记不住?试试cgdb,界面更友好
纯命令行的GDB,看代码的时候可能有点费劲——比如想一边看代码一边调试,得来回输l
命令。这时候可以用cgdb
,它是GDB的“增强版”,界面会分成两部分:上面显示代码,下面是GDB命令行,用起来更直观。
(1)安装cgdb
- Ubuntu/Debian:
apt install cgdb
- CentOS/RHEL:可能需要先装epel源,再输
yum install cgdb
(对应你原文里的cgdb安装图)。
(2)用cgdb调试
打开方式:终端输cgdb 你的程序名
,比如cgdb test
。界面如下(对应你原文里的cgdb界面图):
上半部分是代码,能直接看到行号;下半部分是命令行,输入的GDB命令(比如b 15
、r
、p sum
)和GDB是完全兼容的,不用重新学新命令。
比如你在cgdb里输b 15
设断点,上半部分的代码第15行会标红,提示“这里有个断点”;输r
运行,程序停在断点处,光标会定位到对应的代码行,看变量、单步执行都很清楚。
七、最后总结
Git和GDB这两个工具,刚开始用可能觉得“命令多、记不住”,但其实不用追求一次性学会所有功能——新手先掌握“常用命令”,比如Git的add/commit/push,GDB的b/r/p/n,遇到问题再查资料,用多了自然就熟了。
毕竟工具是为了解决问题的:Git帮你管好代码版本,不用再担心“改崩了回不去”;GDB帮你快速找bug,不用再靠printf“盲试”。学会这俩,写代码能省不少事~
如果觉得这篇内容有用,可以收藏起来,以后遇到问题再翻一翻。有疑问的话也可以在评论区交流,一起进步~
GIt版本控制器
-
如何理解版本控->Git&&gitee||github
- 版本控制
- 这里我们引出学生和老师的例子:我们交作业的时候,第一版第二版交给老师,老师都不满意,知道交到第4版的时候,老师说,还不如你的第一版,用你的第一版吧,这时候有两位学生,第一位学生做的时候直接在源文件上进行修改,第二位学生将每个版本都放在了一个文件夹里。所以交的时候,第一位同学早已找不到了,第二位同学可以打开文件夹找到自己的第一版重新交给老师。第二位同学的行为就叫做版本控制
]
- 这里我们引出学生和老师的例子:我们交作业的时候,第一版第二版交给老师,老师都不满意,知道交到第4版的时候,老师说,还不如你的第一版,用你的第一版吧,这时候有两位学生,第一位学生做的时候直接在源文件上进行修改,第二位学生将每个版本都放在了一个文件夹里。所以交的时候,第一位同学早已找不到了,第二位同学可以打开文件夹找到自己的第一版重新交给老师。第二位同学的行为就叫做版本控制
- 仓库
- 数据管理||远端仓库
- 版本控制
-
git和gitee和github关系图:
git是一个版本控制器
- 去中心化的分布式的控制器
-
可以互相拉取
-
协作开发:
- 模块:
- 模块:
-
Git历史
版本管理工具收费
git研发,一到两周
开源
Git的操作
.git:隐藏的本地仓库,用tree显示
git提交的时候,只会提交变化的部分
提交的时候,需要先提交到本地的仓库
三板斧:
add 添加到临时暂存区:可以允许多次添加,一次提交
git status:可以看到暂存的状态
git reset可以删除
git commit -m“”:可以提交到本地仓库,“不能胡写”
git log:可以查看提交日志
可以推送到远端:git push
如果本地仓库删掉:如果拉取以前的日志
git clone 仓库链接
git 命令行安装:
yum install git
apt install -y git
git–version–查看git版本
2.git 输入用户名username,email
首次使用:需要现场看
3.git版本管理–只进行管理源文件。
4.gitignore文件:过滤文件后缀(需要忽略的文件),OBJ文件配置后不能上传到远端,
冲突:两个不同的程序员提交了一样的但修改的文件
解决方法:
git pull:拉取(远端同步)
git精品课导入
- 调试器–gdb/gcbd
- 软件发布的版本有两种
-
release
- Linux我们编译好的代码,无法直接调试
- gcc/g++默认的工作模式是release模式
- Linux我们编译好的代码,无法直接调试
-
debug:
-
-g:变成debug模式,文件大小会变大
-
程序要调式:必须是debug模式,编译的时候要
加-g,gbd携带调试信息的exe
-
-
- 软件发布的版本有两种
调试器
- 快速认识gbd
- bin
- quit
- l
- r
- g
- gbd命令的学习
- 解决难用的命令
-
cgdb+文件名
-
安装
-
界面
-
-
打断点,让程序停下来
- b 文件名 c:行号/函数
- b 行号
-
-
info b查看断点
-
d 断点编号
-
r运行程序
-
-
gbd不退出,断点变化
-
-
-
-
- 点赞
- 收藏
- 关注作者
评论(0)