Git


前言

写在开篇

今天是2021/9/12,计划和同学一起开发微信小程序了,看了下语法大概就是html和css以及Vue的魔改,这个问题应该不大。重点是我们觉得这也是第一个正正经经的可以算得上项目的东西了,所以还是决定好好打磨它,于是乎这个时候就想到了版本管理的问题,自然而然就得开始学习Git了

更新日志

2022/02/04
现在是1:09 AM,计划在今天下午和逸飞大佬研究git技术,忽然想起自己写过一篇git的笔记,就打算放到自己的个人博客上了

2022/10/10
现在是2:12 AM,在字节历经了一系列捶打后,我决定修订并补充一些内容

关于版本控制的一些话

为什么要有版本控制

比如今天觉得第一版不好,就出了第二版,但是第一版怎么办呢,总不能删了吧——万一哪天又觉得第一版好怎么办?
存在本地又不好大家合作开发,所以我们需要一个中间的平台来储存众多版本

版本控制的发展史

1.本地版本控制

在本地记录保存每次更新,适合个人开发用

很方便,但是也很明显,很low

2.集中版本控制——SVN
所有版本都放到一个服务器,这样一来就方便协同开发了
(缺点是不联网就很难办,另外,要是服务器炸了就可以重开了)

3.分布式版本控制——Git
每个人都拥有完整的代码,所有的版本信息都会同步到每一个开发者,
断网的时候可以本地提交,有网络时会自动同步,这样一来只要有一个还保留着代码,就能很快恢复数据
(缺点是,安全隐患大,容易出内鬼;另外这同一份文件多次存储,加大了空间消耗)

Git下载与安装

官网下载比较慢的话,
那么就试试镜像下载吧,相信用过npm的应该很熟悉了:git镜像下载
进去之后选一个稍微旧一点的版本下载
在这里插入图片描述
64位就找64位咯
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里要注意,选择默认的文本编辑器
在这里插入图片描述
我选的visual studio code(虽然喜欢idea
在这里插入图片描述

然后管他三七二十一地,直接莽Next就完事,最后finish,安装完毕
此时鼠标右键可以看到Git的相关内容,
这里也可以看到
在这里插入图片描述
它们分别是:
Git Bash:Unix与Linux风格的命令行
Git CMD:Windows风格
Git GUI :图形界面版本Git,但是初学者嘛还是先学会用命令行比价好,所以暂时不推荐使用

为了以后更好地学习Linux,我们这里采用Git Bash

基本Linux命令

在这里插入图片描述
点开就能看到类似这样地画面
在这里插入图片描述
好了,这下得开始学Linux命令才能继续玩下去了

关于这一部分,可以去参考我的另一篇blog(暂时还没发布)

基础使用

配置信息

在使用之前,要做一些配置,下面这个命令就是查看配置列表啦

git config -l

(这里我就打码了,自己看自己的去)
在这里插入图片描述

还可以更细致一点,使用下面这个命令就是查看系统配置

git config --system --list

在这里插入图片描述

类似地,这样可以查看用户配置

$ git config --global --list

在这里插入图片描述

这里需要我们配置一下个人信息,
如果不执行这一步配置操作的话,是无法进行后续流程的

$ git config --global user.name "Serio"
$ git config --global user.email "2779066456@qq.com"
$ #第一个是配置名称,第二个是配置邮箱

然后再使用下面这个命令查看一下配置是否成功

$ git config --global --list

在这里插入图片描述系统配置会保存在Git安装目录下的etc文件中的config文件里面
用户配置会保存在C盘用户文件下的gitconfig中

在说下一个命令以前,先得提一下

Git的构成部分

Git有三个工作区域:

1.工作目录
2.暂存区
3.本地仓库
4.远程仓库

其实本地仓库和远程仓库就是位置不一样,
所以还是算三个工作区域

git的三个工作区域

1.workspace/working directory
工作区,就是平时存放代码的地方。没有被git相关命令操作过的文件都在这个区域。
2.index/stage
索引区/暂存区,用于临时存储,是一个文件(.git/index),存储将要提交到文件列表的信息,将文件数据映射到内存,便于管理。
3.repository/history
本地仓库区,能安全存储数据的位置,存储了所有版本的数据。其中的存在一个HEAD指针,其指向的版本即当前分支的最新版本。
4.remote directory/repository
远程仓库,托管代码的服务器。比如github这类平台,就给用户提供了远程仓库。

Gitj基本命令

首先,你需要一个文件夹,在这个文件夹下执行这个命令:

git init

好了,恭喜,你得到了一个本地git仓库!

在这里插入图片描述

让我们从右往左看:

当我们创建了一个新的文件,它就处于workspace工作区中。然后我们写完了文件内容,就可以使用下面这个命令来将它们放入stage(index)暂存区暂存

git add [文件名字] # 将指定的文件暂存
git add .         # 将所有文件暂存,.表示所有

暂存之后,我们检查无误了,就可以用下面这个命令来将它们放入repository(history)本地仓库长期存储

git commit -m "这是一段注释信息"
# 你可以理解为把这些文件作为一个版本存档,
# 然后标注一段信息便于以后识别

看到这里,读者可能会觉得stage暂存区这种设计有点多余——但是之后我们就会知道这种设计的意义所在,现在先接着往下看

由于repository本地仓库中存储着所有历史版本文件,所以我们也可以查看各个历史版本:

git log # 查看(当前分支)所有历史版本的commit信息
# 每个历史版本都有一段hash值id————就是一个长字符串,这里假设为xxx
git checkout xxx # 切换到xxx版本

# 也可以像下面这样选版本,HEAD表示头指针指向的版本
git checkout HEAD~1 # HEAD~1表示其后面一个版本
git checkout HEAD^1 # 同上
git checkout [name] # name填分支名字,可以切换分支

上面提到了一个概念【分支】——那是什么?现在不知道没关系,我们后面再遇到这个词的时候再解释。

好了,我们去github上找一些自己感兴趣的仓库看看,并用下述命令下载到本地:

git clone [仓库地址] # 会下载到git当前所处的目录下
# 由于fetch的使用相对较少,就留给读者自行了解,此处不再赘述
# 好吧我承认,是我自己目前没怎么用过,避免在此误人子弟

本地搭建

$ git init

初始化
注意这是个隐藏文件,所以要勾选显示隐藏文件才看得见
在这里插入图片描述
远程克隆
首先我们先建立一个远程仓库
(由于hub比较卡顿,所以我们这里用ee)
在这里插入图片描述

$ git clone "https://gitee.com/Serio/test.git"

在这里插入图片描述
然后同样的我们就得到了这个库

这个时候可能就有人要问了,这都下载到c盘去了,要怎么下到指定路径呢?

这还是先得用cd等命令
在这里插入图片描述
比如这样就进入了e盘,然后建立仓库之类的就会在e盘下进行

文件状态

通常来说,在一个被多次git操作的工程项目中,

文件通常有四种状态:

1.Untracked:未跟踪

这个文件在项目中,但是没有传到git库里面,不参与版本库,
执行下述命令,改变为Staged

git add .

2.Staged:暂存,
执行git commit后将提交到库中,此时本地库中文件又和工作区一致了,文件又变为 Unmodify

git reset HEAD [filename]

那么就会取消暂存,回退到Modified


3.Unmondify:已经传入库,未修改

即仓库中文件快照内容与工作区中内容完全一致,
此时可以执行下述命令从工作区移除文件

git rm --cache [filename]

如果修改文件内容,那么状态变为Modified


4.Modified:修改过
在执行下述命令后撤销修改内容,返回Unmodify状态

git checkout [hash]

也可以在执行git add后变为Staged


实际操作示例
首先我们新建一个文本
在这里插入图片描述

$ git status "LEC牛逼"

查看文件状态

$ git add "LEC牛逼.txt"

添加

$ git commit -m "这是第一次提交测试"

在这里插入图片描述
当然,如果我们不想让每一个文件都上传,那么可以定义一个扩展名为gitignore的文件
在这里插入图片描述
配置内容依次解释为,忽略根目录下的TODO文件,忽略所有txt文件,但是”LEC牛逼.txt”除外

远程仓库配置

执行下面这条命令,生成一个密钥对

$ ssh-keygen -t rsa

-t表示采用加密(我估计是tea的简写),rsa是一种加密算法,这个命令就是说用rsa算法生成一个密钥对——由一个公钥和一个私钥组成,其中公钥就是公开的秘钥,私钥就是不公开的秘钥。

有什么用?举个例子:

苏媛媛打算于月黑风高之时去富婆的豪宅happy。一片漆黑之中难以辨别人物身份,但是好在全球所有富婆都有苏媛媛给的公钥——可以解开与之唯一对应的私钥的加密,苏媛媛在小纸条上写下一段话:

我是苏媛媛,Hello World就是向你问好,因为你就是我的全世界

然后拿出自己私藏多年的私钥加密,这段信息就变成了:

拟宠求币吗?虫Q必,充充充,斗格诶渥崇求币~~

然后把这个纸条包个石头揉成团,从豪宅的窗户里扔进去——

正常人看了一眼只能是懵逼,但是富婆拿着公钥试着解密,就能发现其中的奥秘了——由于公钥和私钥的加密解密是唯一对应的,所以这里就可以识来者的身份是否为苏媛媛

类似地,代码和富婆一样是需要爱惜的,不能让不三不四的人接触,所以需要用密钥对来鉴别访客身份

我们把生成的公钥交给github等平台,再保管好私钥,之后每次访问都像上面的比喻中那样校验身份了

当然,公钥不一定都是用于解密,私钥也不一定都是用于加密

如果你想了解更多ssh、rsa、秘钥等相关的知识,可以看看我的另一篇博客(还没发布)

我们接着操作:

在这里插入图片描述

然后去这里(./ssh/id_rsa目录下)找找生成的公钥(扩展名为pub那个)

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

打开公钥文件,复制里面的内容粘贴到下面这里
(此处以gitee为例)

在这里插入图片描述
其实到这里就已经完成了公钥配置了,不过我们就顺便把创建仓库也说一下

新建一个库
在这里插入图片描述

如果不太清楚开源协议的话,可以点框起来的部分

在这里插入图片描述

然后一路我不在乎————下一步下一步(好吧这个根据个人需求来就行,不过目前个人对开源协议没什么研究,所以就不过多评价了)

在这里插入图片描述

得到远程仓库之后,我们就不同本地的了(原来那个可以删了)
来克隆一下

IDE下使用Git

这里以idea为例,展示IDE下使用Git,其余IDE同理

idea创建一个普通项目

在这里插入图片描述

这里我的IDEA帮我自动配置好了这两个东西
打开看看

在这里插入图片描述
在这里插入图片描述
然后我们把下载到本地的git文件的内容移动到工程文件中
在这里插入图片描述
这里红色的就是代表选中状态,绿色代表已经提交
右上角也多了几个按钮
在这里插入图片描述
底部也多了终端的几个选项
在这里插入图片描述
接下来我们在终端使用

$ git add .

添加所有文件到暂存区
在这里插入图片描述
当然鼠标右键找到git选项中的add,也能实现同样的效果
添加到暂存区之后的文件都变绿了
在这里插入图片描述
然后输入一下描述信息,直接提交就好了

在这里插入图片描述
当然,使用

$ git commit -m "这是第一次提交阿巴阿巴阿巴.."

也能达到同样的效果

当看到这个的时候
在这里插入图片描述
就已经提交到本地仓库了
如果要同步到远程,可以使用

$ git push

(终端不需要加$;push后面什么都不写)
或者点击IDEA的快捷按钮:推送,即可完成同步
在这里插入图片描述
这就很棒了

分支

主干叫master,一定要对应最优的稳定运行版本
查看本地库的分支

$ git branch

在这里插入图片描述
查看远程库的分支

$ git branch -r

在这里插入图片描述

实际场景分析

深入进阶(待更新)

tree对象

blob对象

entry对象


文章作者: Serio
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Serio !
  目录