【Linux系统】—— 版本控制器Git

发布于:2025-02-14 ⋅ 阅读:(36) ⋅ 点赞:(0)

1 如何理解版本控制

  在理解版本控制之前,我们先来举个简单的例子来理解
  

1.1 第一阶段

场景如下:
  学校老师要我们要上交 C语言 的实验报告。性子比较急的张三匆匆把实验报告写完就上交了,老师看到非常不满意,让张三回去修改;修改完后张三再提交,老师还是不满意,如此反复四五次后,老师说:“算了算了,你看你改的都是啥啊,你还是交第一版的上来吧。” 张三一听就傻眼了,因为他根本就没有保留第一个版本的报告。
  这时,优等生李四也写完实验报告去上交,老师同样不满意,让李四回去修改。李四回到宿舍,看到一脸忧愁的张三,想:“万一老师最后也要我的第一版报告怎么办?我要把每次修改前的实验报告保存一份”。因此李四将实验报告备份成 v1 后再做修改。如此修改了好几次,一直修改到 v5 版本后老师依然不满意,最后老师说:“李四,你还是把你的第一版报告交上来把。”,李四一听一脸不慌,因为它对每一个版本都做了备份,因此拿出 v1 版本的实验报告就交上去了。
  
  李四对每一个版本都进行了备份的工作,就是版本控制
  既然可以把实验报告多版本控制起来,那我们也可以把我们代码多版本控制起来
  我们为什么要进行版本控制?其实就是为了应对善变的甲方
  
  上述例子中,老师就相当于产品经理或者项目经理,张三李四相当于程序员。我们程序员自己写的代码经常会被别人提各种各样的要求而改来改去。我们把李四从 v5 版本回到 v1 版本的过程称为 回滚/回退版本控制主要是为了我们可以随时进行回退。
  

1.2 第二阶段

  让我们进入第二阶段的故事。

  李四在进行版本控制时,是自己手动 ctrl + c / ctrl + v 进行控制的。李四觉得自己做太麻烦,便写了一个工具来自动化完成版本的备份回退等工作,而这个工具就叫做版本控制器

  李四是一个善良的人,他看到学院这么多同学都要受到老师的折磨,便通过校园墙告知大家可以免费帮大家进行版本控制。于是,王五、赵六等人就去找李四帮忙,李四就用版本控制器给他们做了版本控制,并给每个人在D盘上创建了对应的文件夹,将每个人的版本放在对应的文件夹中维护起来

在这里插入图片描述

  我们把给王五、赵六等人建立的文件夹叫做仓库!所以我们平时说的仓库本质就是文件夹
  

1.3 第三阶段

  随着越来越多人来找李四进行版本控制,李四想:“不仅仅是这个C语言的老师,我们学校肯定还有其他老师这么恶心;不仅仅我们学校,全国其他学校肯定也有这样的老师,那又有多少学生受此煎熬。”于是,李四想做些什么,来改变世界。
  李四想:可不可让世界上的任何人都成为李四呢?这样每个同学都可以自己自动化的把自己的实验报告进行版本控制。

  李四开始动手了。此前所有人的实验报告都在李四的电脑 D盘 存着,只有李四能访问,因此李四花点钱买了一个云服务器,将大家的实验报告都放在了云服务器上,这样大家都能访问了。
  李四又做了一个软件,这个软件相当于客户端,这个客户端可以获取当前用户的实验报告的目录,方便查看版本、下载和上传等。

  可是李四又想,万一这个人没网呢?那不是什么都做不了?李四又想了一个办法。
  李四又开发了一个应用程序,该应用程序可以在当前的Windows账号中,在指定的目录下新建一个仓库,并将实验报告添加到该指定仓库中,并可以获取本地仓库的任何版本。李四将这个应用程序命名为git
  这样所有不会自己进行版本控制的同学就不用找李四了,而且即使没有网也没有关系。只需要下载李四开发的应用程序,将自己的报告给这个应用程序就可以自动在本地进行版本控制了

  我们将每个人自己新建的文件夹称为本地仓库!而帮助每个人

在这里插入图片描述

  

1.4 第四阶段

  这时,李四又想:首先要是电脑坏掉了怎么办,那本地仓库不就没了?里面的各个版本的实验报告也就丢失了。即如何保护数据安全。如果仅仅是在本地进行版本控制明显不能满足以上要求。

  这时,李四之前买的云服务器就有用了。经过李四的努力,该仓库具备以下功能:运行每一个用户将自己的本地仓库 push 到该云服务器对应平台上,因此平台上会有每个人的本地仓库的备份,我们将云服务器中的仓库叫做远端仓库远端仓库的内容和本地仓库的内容是完全一样的

  现在,新需求又来了:可能有些用户需要建立不同的仓库,来分别管理C语言实验报告,物理实验报告,化学实验报告等等。说白了就是每个人需要创建不同的文件夹,每一个文件夹管理不同学科的实验报告
  那用户可不可以通过客户端,将所有的仓库都推送到远端?

  于是,云服务器需要进行用户身份识别,即登录注册。这样每个用户就可以将自己的多个本地仓库推送到自己远端服务器的账号下。

  李四又想:一个用户如果直接在远端仓库进行版本控制,那远端和本地两个仓库内容不就有差别了吗。李四又想点子,能不能让 git 在客户端和服务器两端都能跑,即在 windows 和 Linux 下都能跑。我们说的两端同步,就是让客户端和服务器下的两个 git 互相进行同步,也就是说这个 git 即是一个客户端又是一个服务器。

  后来,李四将这个云服务器平台命名为gitee/github

  最终的结论是:git 是一个版本控制器,gitee/github 是一个基于 git 的网站平台

在这里插入图片描述

  
  

2 Linux 上 git 操作

2.1 创建仓库并克隆到本地

在这里插入图片描述
  
在这里插入图片描述
  
在这里插入图片描述
  

在这里插入图片描述

  
  指令:git clone 仓库链接

在这里插入图片描述

:如没有下载「git」可输入指令:sudo apt install -y git / sudo yum install -y git
  

在这里插入图片描述

  仓库 test 中,有一个 .git 目录,严格意义上讲真正的仓库是这个 .git我们将.git 称为隐藏的本地仓库。
  .git中包含着我们所有的修改记录。未来我们将自己的代码提交了,它会将我们各种对应的版本 v1、v2 等的具体修改数据都会保存在 .git 的特定目录下。

  前面我们举例子时,李四是直接进行拷贝的,而 git 并不是这样做的。

  git 进行版本控制时,不需要记录不变的,只会记录变化的部分。我们对代码的相关操作无非就是增删改,git 只需进行相应记录即可
  例如 100 行代码,我们删除了第 10 行,git 只需要记录 “删除第10” 行这个字符串即可,未来需要进行回退,只需将这第 10 行代码反向添加即可。
  

2.2 git 的提交(三板斧)

  我们先在本地仓库创建一份代码

在这里插入图片描述

  
  现在,我们在本地仓库创建了 test.c,那 test.c 当前有没有在我的仓库里被管理起来呢?

在这里插入图片描述
  并没有。

  我们往往至将 .git 称作仓库,而当前的目录称为工作区。此时的 test.c 在工作区中,即只在自己的 Linux 中存在
  

2.2.1 add

  将test.c添加到本地仓库

  使用指令:git add 文件名git add .

  「.」 表示将当前陌生文件全部添加至仓库中

  当 add 后,test.c 也并没有真正添加到本地仓库,而是添加到了 .git 的一个暂存区中。

  暂存区有什么用呢?暂存区允许多次添加,我们可以多次 add 将代码放入暂存区,后一次性提交到本地仓库。而且暂存区的数据,如果不想提交了是可以恢复的

在这里插入图片描述

  
  但我怎么知道现在的 test.c 是什么状态呢?我们可以通过 status 指令来看到我们当前对应的状态

指令:git status

  在这里插入图片描述

  

2.2.2 commit

  将暂存区的文件提交到本地仓库

使用指令:git commit -m “日志信息”

  

:输入此指令后,如果你是第一次输入,系统可能会让你输入邮箱和用户名密码。这时系统会将指令的格式给你显示出来,你只需要将格式中引号内的内容改成你的自己的邮箱或用户有即可!

在这里插入图片描述

:日志一定不要乱写,必须写清楚本次提交核心做的工作是什么。每次提交的日志信息 git 全都会记录下来
  

查看日志指令:git log

在这里插入图片描述

  面试官只要 git log 一下,你每一次提交的信息都会呈现在面试官面前。所以日志不能乱写

  做完 addcommit,此时我们的代码已经在本地仓库中管理起来了,下一步就是将代码推送至远端
  

2.2.3 push

  第三步:将本地仓库推送至远端

输入指令:git push

在这里插入图片描述

  
  自此,我们就将 Linux 端本地所对应的 test.c 推送至远端了

在这里插入图片描述

  
:git 版本管理,只进行管理元文件及只管理 .h、.c、.cpp。提交其他后缀的文件无法提交,因为 .gitignore 文件会自动帮我们根据文件后缀名进行文件过滤。出现在 .gitignore 文件中的后缀都是无法提交的,我们也可以自己修该 .gitignore 文件来过滤不想提交的文件

在这里插入图片描述
  
在这里插入图片描述

  

2.3 多平台操作

  现在,我在 windows 系统中,将刚刚的远端 test 仓库拉下来,并对 test.c 代码进行修改,最后再将修改后的代码提交到远端仓库。(在 windows 中的操作这里就不演示了)

  现在有个问题:windows 系统的用户已经将代码修改了并提交上远端仓库了,可 Linux 系统的用户并不知道,继续在修改 test.c,继续使用三板斧上传

  此时就会报错

在这里插入图片描述

  此时需要将远端仓库和本地仓库做一次同步
  

输入指令:git pull

  这时,系统就会自动将刚刚 windows 程序员所做的修改同步到你的本地

在这里插入图片描述

  我们再 push 就提交成功了(刚刚我们已经 commit 了,此时不用再 commit)

在这里插入图片描述


  
  同理,此时 Linux 程序员修改了代码,windows 程序员并不知道,在旧版本上修改代码,上传到本地没有问题,可是上传到远端也是会报错的 。

  此时 windows 的本次仓库相比与远端仓库已经不是最新的了,这时 windows 程序员就需要将本地仓库与远端仓库同步。同样是 pull,然后再 push

在这里插入图片描述

  小结:远端仓库,相比于任何人都是最新的

  所以为什么要冲突呢?冲突是提醒本地用户和远端仓库进行同步了

  
  
  
  


  好啦,本期关于编译器 gcc/g++ 就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在 Linux 的学习路上一起进步!