6. 版本控制器Git
在我们日常的学习中或者是完成学校的报告,我们常常在编写各种问道是,为了防止文档的丢失,更改失误,失误后能恢复到原来的版本,不得不复制出一个副本出来,比如:
"报告-v1"
"报告-v2"
"报告-v3"
"报告-确定版"
"报告-最终版"
......
每个版本有各自的内容,但是最终只有一份报告需要被我们使用。
但是在此之前的工作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的文件就越来越多,文件多不是问题,问题是:随着版本数量的不断增多,我们已经不记得了这些版本各自都具体修改了什么内容,做了什么操作。
文档如此,项目代码也是一样的,也是存在这个问题的!!
下面举一个例子,帮助我们更好地理解 :git 的核心功能 -- 版本控制
例子:
学校老师上完C语言课要求同学们完成一份有关C语言的实验报告,要求一一给同学们说了。到了第二天,张三完成了报告并将报告交了上去:

张三回寝室后在报告上这里改一点,那里改一点,就这样三五次都没有改好:

听完老师的话张三头都大了,因为张三再做修改的时候都是基于在上一次的内容上直接做修改,回到寝室后,一蹶不振,天天都在想,第一天改了哪些?第二天改了哪些?第三天......
过了半个月,同样,张三的室友李四也完成了报告,就去交给老师:

李四基于张三的经历,在每次改动报告前,先 ctrl+c 了一份,就这样改了3次,实验报告的截至日期也到了:

李四每一次在做修改之前,对每一次的实验报告做备份,李四就在做版本控制。版本控制的本质 是:应对不同的变化!
在上面的例子中,张三李四被称为程序员,实验报告就是程序员写的代码,老师就是产品或项目经理!一个开发团队就应该需要有无数个像李四这样的人。实际上使用git的时候,版本控制不是我们想的那样:直接ctrl+c/v;而是新建一个修改记录:

所以,会把我们修改的过程记录下来的的我们称之为版本控制。

6.1 版本控制器
为了方便我们管理这些不同版本的文件,便有了**版本控制器。**所谓的版本控制器,就是能让你了解到一个文件的历史,以及它的发展过程的系统。通俗来说,就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。
目前最流行的版本控制器就是Git。Git可以控制电脑上所有格式的文件,例如:doc、excel、dwg、dgn、rvt等等。Git最重要的就是可以帮助我们管理软件开发项目中的源代码文件!
6.2 git简史
1. 背景:Linux 内核开发的困境
在 2002 年之前,Linux 内核团队使用一个名为 BitKeeper 的专有分布式版本控制系统来维护代码。BitKeeper 的持有者 Larry McVoy 出于友好,免费授权给 Linux 社区使用。
然而,2005 年发生了一场社区冲突:当时维护 BitKeeper 工具与 Linux 仓库桥梁的开发者 Andrew Tridgell,被指控对 BitKeeper 进行逆向工程(违反了许可协议)。这导致 BitKeeper 的免费授权被收回。
Linux 的创造者 Linus Torvalds 和整个内核开发团队,突然失去了赖以协作的核心工具。当时已有的替代品(如 SVN、CVS)都是集中式版本控制系统,在性能、工作流程和分布式协作方面,完全无法满足 Linux 内核这种庞大、高度并行开发项目的需求。
2. Linus 的"十天创造"
面对工具真空,Linus Torvalds 决定自己动手。他的设计目标非常明确:
- 分布式:每个开发者都拥有完整的仓库历史,可以离线工作。
- 高性能:极快的分支切换、提交和合并操作(Linux 内核有数万个文件)。
- 完全离线:支持非线性、并行的开发流程。
- 数据完整性 :使用 SHA-1 哈希来保证提交、文件、目录的完整性,防止数据 silently corrupt。
- 简单的设计 :对内容的存储方式采用类似 快照 而非差异的方式。
2005年4月3日 ,Linus 开始了 Git 的开发。到 4月7日 ,Git 已经完成了首次自举(即用 Git 来管理 Git 自身的源代码)。到 4月18日,Linux 内核 2.6.12 版本已经切换到了 Git 进行管理。
这段"十天创造"的传奇,充分体现了 Linus 对问题本质的深刻理解和强大的执行力。
6.3 安装 git (默认云服务器上是自带的)
可以输入命令:git version 来查看

安装命令:yum instal -y git (没有 git ,就输入括号前面的命令)
6.4 在 gitee 创建项目 (也可以在 github 中创建项目,但是有可能网速啥的都有点慢,毕竟是国外的网站)
注册账号
操作比较简单,自行百度。
创建项目
1. 


下载项目到本地

这里的 url 就是刚刚建立好的 项目 的链接

6.5 三板斧
1. git add
将代码放到刚才下载好的目录中
git add [ 文件名 ]
将需要用 git 管理的文件告知 git
2. git commit
提交改动到本地
git commit -m "XXXX"
最后的 "."表示当前目录
提交的时候应该注明提交日志,描述改动的详细内容。
3. git push
同步到远端的服务器上
git push
需要填入用户名和密码,同步成功后,刷新 Gitee(Github) 页面就能看到代码改动了
配置免密码的提交(不建议,后续可能长时间不输密码,会忘记密码)
实操:
















4. 其它
git log/status/pull(上面的实操中有提到)
.ignore
首次使用的话,可能需要现场解决

7. 调试器 - gdb/cgdb
7.1 样例代码
cpp
// mycmd.c
#include <stdio.h>
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;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\n", start, end, n);
return 0;
}
7.2 预备
- 程序的发布方式有两种,debug 模式和 release 模式,Linux gcc/g++ 出来的二进制程序,默认是release 模式。
- 要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项,如果没有添加,程序被编译
7.3 常见使用(先只列出本篇文章涉及到的常见命令,剩余的命令会在后续的文章中介绍)
- 开始:gdb 文件名
- 结束:ctrl + d 或者是 quit 调试命令
|------------------------|-----------------------|--------------------------|
| 命令 | 作用 | 样例 |
| list / l | 显示源代码,从上次位置开始,每次列出10行 | list/l 10 |
| list / l 函数名 | 列出指定函数的源代码 | list/l main |
| list / l 文件名:行号 | 列出指定文件的源代码 | list/l mycmd.c:l |
| r/run | 从程序开始连续执行 | run |
| n/next | 单步执行,不进入函数内部,逐过程F10 | next |
| s/step | 单步执行,进入函数内部,逐语句F11 | step |
| break/b[文件名:]行号 | 在指定行号设置断点 | break 10 break test.c:10 |
| break/b 函数名 | 在函数开头设置断点 | break main |
| info break/b | 查看当前所有断点信息 | info break |
| delete/d breakpoints n | 删除序号为n的断点 | delete/d breakpoints 1 |
| quit | 退出GDB调试器 | quit |
实操:



7.4 常见技巧 ------ 加餐






