Linux —— 基础开发工具4

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 常见技巧 ------ 加餐

相关推荐
diegoXie1 小时前
WSL2 跨系统文件移动
linux·ubuntu
一尘之中1 小时前
Linux命令行查看磁盘大小完全指南
linux·运维·ai写作
马儿能够一直跑2 小时前
同一个环境中安装两个不同版本esp-idf的python冲突解决方案
linux·运维·服务器
小雪_Snow2 小时前
Rocky 操作防火墙
linux
tang_vincent2 小时前
Linux物理内存管理-引导内存分配器
linux
vortex52 小时前
从 Scoop 故障看 Windows 与 Linux 软硬链接与权限机制的底层差异
linux·运维·windows
Felven2 小时前
盛科工业千兆网交换机端口计数查看
运维·网络·盛科交换机
洒家肉山大魔王2 小时前
Kubernetes中Pod 处于 CrashLoopBackOff 状态(生产环境)
linux·容器·kubernetes·pod·pod循环重启
Unlyrical2 小时前
为什么moduo库要进行线程检查
linux·服务器·开发语言·c++·unix·muduo