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

相关推荐
bjzhang7524 分钟前
CentOS下安装MySQL详解
linux·mysql·centos
Jason_chen2 小时前
Linux 6.2 音频机制深度解析:AI驱动的低延迟音频与零信任音频安全架构
linux
下午写HelloWorld2 小时前
Linux系统及Ubuntu常用指令
linux·ubuntu·操作系统
lizhihai_993 小时前
股市学习心得-AI 产业链核心标的梳理清单
大数据·服务器·人工智能·科技·学习
云计算磊哥@3 小时前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
weixin_523185323 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
黄同学real4 小时前
解决 Visual Studio Web Deploy 远程发布报 401 未授权 (ERROR\_USER\_UNAUTHORIZED)
服务器
天天进步20154 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket
凡人叶枫4 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽5 小时前
玩转RK3506SDK
linux·嵌入式硬件