hello,家人们,今天咱们来介绍Git以及Git相关的操作,好啦,废话不多讲,开干.
1:Git初识
在介绍Git前,博主首先讲一个小故事.
我们学计算机的小伙伴们,在学校里头都有实验课,那么老师呢就会要求我们写实验报告并且要求我们交上去给老师检查.有一个学计算机的大学生,名字叫张三,然后临近期末了,C语言老师要求学生们做一个课程设计并且写一份课程设计报告出来,这时候张三选择了做一个图书管理系统,然后呢张三用了一周的时间完成了课程设计然后把课程设计报告交给了老师,老师一看,说:张三啊,你这个课程设计完成得还是不错的,但是这个报告呢,写得比较粗糙,你下去再修改下,这个时候张三就听老师的话,下去修改了下,然后过了几天,张三又来找老师了,老师一看,就说:张三啊,你这个比上份那回报告写的好很多了,就是在某个板块上写得怎么说呢,不是很通俗易懂,你下去啊再改改吧,张三听了老师的话,然后下去又改了改,然后过了几天,张三又来找老师,老师一看,就说:张三啊,你这个报告怎么比上回改的还要差了呢而且格式也不对,你下去再改改吧,张三听了老师的话,下去接着改,然后过了几天,张三又去找了老师,老师一看,就说:张三啊,我看你这孩子挺努力的,我也不想再刁难你了,这样吧,你把改的第二版的实验报告给我吧,张三这时候听到这就很懵了,我第二版改的是啥来着,完全不记得了,然后张三就回到了宿舍跟舍友说下了这个事,同宿舍的舍友李四一听这个事就长了个心眼,为了防止之后交实验报告出现跟张三一样的情况,就想着,想着老师也要求自己频繁性地改课设报告的话,那我得提前做好准备,然后李四呢也去交了课设报告,果然,李四也发生了同样的情况,也被老师要求改实验报告,但是李四呢,每次在改实验报告前,都会把实验报告先复制一份留存,然后再去改,就这样子,李四连续被老师要求改了四次,到了第四次交实验报告的时候,老师说:李四啊,我看你这孩子挺聪明的,情商也挺高的,我也不是很想刁难你,这样子吧,你把你第三版的课设报告给我吧,然后李四回到宿舍呢,就直接找到了第三版的实验报告,接着交给了老师.故事到这就结束啦!
从上面的故事回归到我们生活中,在我们学习时,是不是经常会遇到这样子的情况:我们在编写各种文档,为了防止文档丢失,更改出现差错,为了防止出现差错后不能够恢复到原来的版本,这个时候就不得不复制出一个副本,就会出现如下情况
每个版本有各⾃的内容,但最终会只有⼀份报告需要被我们使⽤,但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越多,⽂件多不是什么大问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么吗?文档会出现这种情况,我们学计算机的在日常写代码中也会出现这种情况.那么如何解决这个问题,这个时候就要提及版本控制器了.
1.1:版本控制器
- 为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每改动和 版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。
-
⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、 dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的 源代码⽂件 !
譬如上述故事中的李四,对每一次修改的课设实验报告进行了存档,然后分别命名为了 版本1,版本2,版本3,版本4 .那么李四所做的工作就叫做 版本控制.
PS:所有的版本控制系统,Git 也不例外,其实只能跟踪⽂本⽂件的改动,⽐如 TXT ⽂件,⽹⻚,所有的程序代码等等。版本控制系统可以告诉你每次的改动,⽐如在第5⾏加了⼀个单词 “hello world”,在第8⾏删了⼀个单词 “hello Linux”。
⽽ 图⽚、视频这些⼆进制⽂件 ,虽然也能由版本控制系统管理,但没法跟踪⽂件的变化,只能把 ⼆进制⽂件 每次改动串起来,也就是只知道图⽚从 100KB改成了120KB ,但到底改了啥,版本控制系统不知道,也没法知道.
1.2:Git安装
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本地仓库
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文件做了什么修改后,再将其提交到本地仓库就放心多了.