代码时光机:Git基础速成

2024-09-01 15:20
文章标签 基础 代码 git 时光 速成

本文主要是介绍代码时光机:Git基础速成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hello,家人们,今天咱们来介绍Git以及Git相关的操作,好啦,废话不多讲,开干.

1:Git初识

在介绍Git前,博主首先讲一个小故事.

我们学计算机的小伙伴们,在学校里头都有实验课,那么老师呢就会要求我们写实验报告并且要求我们交上去给老师检查.有一个学计算机的大学生,名字叫张三,然后临近期末了,C语言老师要求学生们做一个课程设计并且写一份课程设计报告出来,这时候张三选择了做一个图书管理系统,然后呢张三用了一周的时间完成了课程设计然后把课程设计报告交给了老师,老师一看,说:张三啊,你这个课程设计完成得还是不错的,但是这个报告呢,写得比较粗糙,你下去再修改下,这个时候张三就听老师的话,下去修改了下,然后过了几天,张三又来找老师了,老师一看,就说:张三啊,你这个比上份那回报告写的好很多了,就是在某个板块上写得怎么说呢,不是很通俗易懂,你下去啊再改改吧,张三听了老师的话,然后下去又改了改,然后过了几天,张三又来找老师,老师一看,就说:张三啊,你这个报告怎么比上回改的还要差了呢而且格式也不对,你下去再改改吧,张三听了老师的话,下去接着改,然后过了几天,张三又去找了老师,老师一看,就说:张三啊,我看你这孩子挺努力的,我也不想再刁难你了,这样吧,你把改的第二版的实验报告给我吧,张三这时候听到这就很懵了,我第二版改的是啥来着,完全不记得了,然后张三就回到了宿舍跟舍友说下了这个事,同宿舍的舍友李四一听这个事就长了个心眼,为了防止之后交实验报告出现跟张三一样的情况,就想着,想着老师也要求自己频繁性地改课设报告的话,那我得提前做好准备,然后李四呢也去交了课设报告,果然,李四也发生了同样的情况,也被老师要求改实验报告,但是李四呢,每次在改实验报告前,都会把实验报告先复制一份留存,然后再去改,就这样子,李四连续被老师要求改了四次,到了第四次交实验报告的时候,老师说:李四啊,我看你这孩子挺聪明的,情商也挺高的,我也不是很想刁难你,这样子吧,你把你第三版的课设报告给我吧,然后李四回到宿舍呢,就直接找到了第三版的实验报告,接着交给了老师.故事到这就结束啦!

从上面的故事回归到我们生活中,在我们学习时,是不是经常会遇到这样子的情况:我们在编写各种文档,为了防止文档丢失,更改出现差错,为了防止出现差错后不能够恢复到原来的版本,这个时候就不得不复制出一个副本,就会出现如下情况

每个版本有各⾃的内容,但最终会只有⼀份报告需要被我们使⽤,但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越多,⽂件多不是什么大问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么吗?文档会出现这种情况,我们学计算机的在日常写代码中也会出现这种情况.那么如何解决这个问题,这个时候就要提及版本控制器了.

1.1:版本控制器

  • 为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每改动和 版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
  • ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwgdgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的 源代码⽂件
譬如上述故事中的李四,对每一次修改的课设实验报告进行了存档,然后分别命名为了 版本1,版本2,版本3,版本4 .那么李四所做的工作就叫做 版本控制.

PS:所有的版本控制系统,Git 也不例外,其实只能跟踪⽂本⽂件的改动,⽐如 TXT ⽂件,⽹⻚,所有的程序代码等等。版本控制系统可以告诉你每次的改动,⽐如在第5⾏加了⼀个单词 “hello world”,在第8⾏删了⼀个单词 “hello Linux”。

图⽚、视频这些⼆进制⽂件 ,虽然也能由版本控制系统管理,但没法跟踪⽂件的变化,只能把 ⼆进制⽂件 每次改动串起来,也就是只知道图⽚从 100KB改成了120KB ,但到底改了啥,版本控制系统不知道,也没法知道.

1.2:Git安装

Git 是开放源代码的代码托管⼯具,最早是在Linux下开发的.开始也只能应⽤于Linux平台,后⾯慢慢 的被移植到windows下,现如今,Git可以在Linux、Unix、Mac和Windows这⼏⼤平台上正常运⾏了.

1.2.1:Linux-Centos下的安装

如果uu们是在Centos的环境下安装,那么安装Git是相当简单的,这里博主的是以Centos7.9为例的,首先可以输入下面这条命令查看自己是否有安装Git.

git --version
  • 若安装git,则会显示下面的情况

  • 若未安装git,则会显示下面的情况,会友好地告诉你git没有安装

那么输入如下命令就能够安装git了,并且会出现如下的情况

sudo yum install git -y

1.3:Git基本操作

1.3.1:创建git本地仓库

仓库是进⾏版本控制的⼀个⽂件⽬录 我们要想对⽂件进⾏版本控制 ,就必须先创建⼀个仓库出来。
当我们创建好了仓库目录后,此时,我们要创建本地的git仓库的话,则通过 git init命令.
当我们使用git init命令创建好了本地仓库后,我们可以清晰地发现此时当前目录下多了一个.git的隐藏文件,.git目录是Git来跟踪管理仓库, 切记不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库破坏了.

1.3.2:配置git

当我们安装了Git后,那么首先要做的事情就是设置我们的用户名和e-mail地址,这是十分重要

git config "用户名"
git config "email"//查看配置命令
git config -l

有的uu可能在配置用户名或者邮箱的时候,不小心配置错误了,那么这时候我就可以通过git config --unset 命令来删除对应的配置命令.

git config --unset user.name
git config --unset user.email

1.3.2.1:global选项

在Git配置仓库的命令中,global选项是一个可选项.如果使用了该选项,表示这台机器上所有的Git仓库都将会使用相同的配置.若uu们希望在不同的仓库中使用不同的name或者e-mail,可以不用global选项,但是有一点要注意,执行命令时必须要在仓库里.

1.3.2.2:global选项的小细节.

PS:这里有一点要注意,当我们在配置命令时,使用了global选项时,那么在删除对应的配置命令时也要带上global选项.

1.3.3:认识工作区、暂存区、版本库

配置完git后,接下来我们来认识下git中的工作区、暂存区、版本库.

1.3.3.1:工作区

工作区:指的是在电脑上要写的代码或文件的目录.

1.3.3.2:版本库

版本库:又名仓库,英文名叫做repository.工作区有一个隐藏目录.git,它不算工作区,而是Git的版本库.这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时候都可以对其追踪历史,或者在将来某个时候可以"还原".

1.3.3.3:暂存区

暂存区:英文名叫stage或index.一般存放在.git目录下的index文件(.git/index)中,我们把暂存区有时也叫做索引(index).

  • 图中的左侧为工作区,右侧为版本库.Git的版本库里存了很多东西,其中最重要的就是暂存区.
  • 在创建Git版本库时,Git会为我们自动创建一个唯一的master分支,以及指向master的一个指针HEAD
  • 当对工作区修改(或新增)的文件执行git add命令时,暂存区目录树的文件索引会被更新.
  • 当执行提交操作git commit时候,master分支会做相应的更新,可以简单地理解为暂存区的目录树才会被真正写到版本库中.

总结:通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件,必须要通过git add 和 git commit命令才能将文件添加到仓库中进行管理.

2:添加文件

2.1:场景一

2.1.1:git add命令

我们在包含.git的目录下新建了一个test.c的文件,那么我们可以使用git add命令将文件添加到暂存区里面.

  • 添加一个或多个文件到暂存区: git   add  file1 file2......
  • 添加指定目录到暂存区: git   add  [directory].......
  • 添加当前目录下的所有文件到暂存区: git  add .

2.1.2:git commit命令

将文件添加到暂存区后,接下来我们再使用git commit 命令将暂存区内容添加到本地仓库中

  • 提交暂存区的全部文件到本地仓库中:git commit  -m  "message"
  • 提交暂存区的指定文件到本地仓库中:git commit  [file1] [file2] .... -m "message"

PS:git commit 后面的-m选项,要跟上描述本次提交的message,由用户自己完成,这部分内容不能够省略,并且要好好描述,是用来记录我们的提交细节的,是给人看的.

git commit命令执行成功后会告诉我们,1个文件被改动(就是我们添加了test.c文件),插入了6行内容(test.c文件有6行内容).

2.1.3:git log命令

截止目前为止,我们就已经能够将代码提交至本地仓库了.我们可以使用git log命令,来查看历史的提交记录.

使用该命令显示从最近到最远的提交日志,并且我们可以看到commit时的日志消息

PS:如果嫌输出信息太多,有些眼花缭乱的话,那么我们可以加上 --pretty = online选项.

PS:我们看到的64168e465578281d29f253f4997982a2351e0e9b是每次提交的commit id(版本号),git 的commit id不是1,2,3......递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示.

2.1.3:查看.git文件

2.1.3.1:未添加任何文件的.git文件
2.1.3.2:添加文件后的.git文件

  • index就是暂存区,add后的内容都是添加到这里的.
  • HEAD就是我们的默认指向master分支的指针.

而默认的master分支,其实就是:

打印的64168e465578281d29f253f4997982a2351e0e9b是什么呢,保存的是当前最新的commit id.

objects为Git的对象库,里面包含创建的各种版本库对象以及内容.当执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就处在".git/objects"目录下,我们可以来看看这些对象有什么用处.

查找object时要将 commit id分成两部分,前两位是文件夹名称,后38位是文件名称.

找到这个文件后,一般不能直接看到里面是什么,该类文件是经过sha(安全哈希算法)加密过的文件,不过我们可以使用git cat-file 命令来查看版本库对象的内容.

其中,还有一行tree 2c83e5a0998109ba5c2a7efffbc3b4516f814548,我们可以使用同样的方法来进行查看.

再看test.c文件对应的c8aefd1b539379b22f17b2f3664a5c97aad09eb.

这就是我们对test.c文件进行的修改,被git记录了下来.

2.1.4:总结

在本地的git仓库中,有几个文件或者目录很特殊

  • index:暂存区,git add后会更新该内容.
  • HEAD:默认指向master分支的一个指针.
  • ref/heads/master:文件保存当前master分支的最新commit id.
  • objects:包含了创建的各种版本库对象以及内容,简单理解就是放了git维护的所有修改.

2.2:场景二

在之前的学习,我们已经清楚了如何向仓库中添加文件、并且对于工作区、暂存区、版本库也有了一定的认识.那么博主再展示一种添加文件的场景,这样子能够加深对工作区、暂存区、版本库的理解.

当我们提交后发现打印了"1 file changed, 0 insertions(+), 0 deletions(-)",这句话的意思是只有一个文件被修改了,那么有的uu就会有疑问,不是新增了两个文件吗?

我们来简单回亿一下,git add是将文件添加到暂存区,git commit是将暂存区的内容添加到本地仓库中.由于我们并没有使用git add test3.c,那么因此test3.c就不在暂存区中维护,所以我们在commit的时候,其实只是把已经在暂存区中的test2.c提交了,而遗漏了工作区中的test3.c.那么该如何提交test3.c呢,其实很简单滴,只要再次add然后commit即可~

3:修改文件

Git比其他滴版本控制器设计得更加完善,因为Git跟踪并管理的是修改,而非文件.

修改的概念:比如你新增了一行,这就是⼀个修改,删除了一行,也是⼀个修改,更改了某些字符,也是⼀个修改,删了⼀些又加了一些,也是⼀个修改,甚至创建⼀个新文件,也算⼀个修改.

总之:新增,修改,删除都可以被称作修改.

那么接下来我们将对test.c文件进行修改~

此时,仓库中的test.c文件工作区中的test.c文件是不同的,那么该如何查看仓库的状态呢?我们可以通过 git status 命令用于查看上次提交之后是否有对文件进行再次修改.

上面的结果告诉我们,test.c文件被修改过了,但是还没有完成添加与提交.

目前,我们只是知道test.c文件被修改过了,但是,如果我们能知道哪些地方被修改了,就更好了,那么我们可以通过git diff 命令来查看文件的哪些地方被修改了~

git diff [file]命令用来显示暂存区和工作区文件的差异,显示的格式正是Unix通用的diff格式.

PS:也可以使用 git  diff HEAD -- [file]命令来查看版本库和工作区文件的区别.

知道了对test.c文件做了什么修改后,再将其提交到本地仓库就放心多了.

这篇关于代码时光机:Git基础速成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127311

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调