git学习(一)

一、代码仓库的初始化

1、先在本地操作,不涉及到远程服务器,创建目录mkdir git demo

想要本地创建的目录成为一个远程仓库就需要初始化git init

git init 后会发生什么?

2、watch -n 1 -d tind每隔1s打印当前文件目录并且刷新

左边命令

watch -n 1 -d tind每隔1s打印当前文件目录并且刷新

在这里插入图片描述

3、代码仓库的初始化git init

git init

在这里插入图片描述

ls -a会看到.git目录

在这里插入图片描述

.git目录下会有右边的文件

在这里插入图片描述

方便看将sample文件删掉
在这里插入图片描述

在这里插入图片描述

4、 cat .git/config 代码仓库的配置文件(实际是当前代码仓库的本地的配置文件)

在这里插入图片描述

5、 git全局的配置文件 (当前用户目录下的cat ~/.gitconfig)

在这里插入图片描述

6、 git config --global -l 打印全局global的配置

在这里插入图片描述

实际上我们是需要配置本地local的配置文件
git config user.name ”demo”
git config user.email ”demo@com”

cat .git/config查看配置信息就会有刚才配置的username信息,代码仓库就会优先使用当前local本地的配置用户、eamil信息,会用到commit时提交信息
在这里插入图片描述
git config -l 将配置列出

在这里插入图片描述

若将刚才本地配置的username信息删掉,会使用全局配置(git config --global -l)的email信息
在这里插入图片描述
全局配置只有一个文件,当前用户目录下的全局配置cat ~/.gitconfig
在这里插入图片描述
若不在本地代码仓库配置user的信息,就会使用全局的代码仓库配置,假设进行提交,有两个用户,需要进行用户切换,显然需要本地配置一个用户覆盖全局配置,再去提交就会显示本地的用户信息,这样就有多少个用户就可以在代码仓库内部去配置本地的信息,相互之间不会冲突。

二、git addb背后到底发生了什么?

初始化一个空的代码仓库,会有一个.git文件夹产生

1、有代码仓库后就需要往代码仓库写文本文件

echo "hello.git" >hello.txt

在这里插入图片描述

敲回车后.git文件里面一点变化都没有?为什么?
因为在代码仓库做的修改默认是放在工作区,工作区的内容不会归git进行管理,但是能识别出在工作区做的修改

2、git status 能识别出在工作区做的修改,能识别出Untacked的hello.txt文件

git status 能识别出Untacked的hello.txt文件

在这里插入图片描述

git为什么能识别出来,后面再进行解释

3、有这个文件后,但是想要git帮我们进行管理

3.1 方便看出有多少个目录,用 tree./git

方便看出有多少个目录,用 tree./git

可看出9个目录,4个文件
在这里插入图片描述

3.2通过git add helloWorld.txt 将它添加到缓存区中

在这里插入图片描述

多了object下的8d (0e41234f24b6da002d962a26c2495ea16a425f)以及index

在这里插入图片描述

3.3git objects对象(主要有blob、commit object、tree object、tag

1)git cat-file可以查看这些object文件。第一可以查看这种object到底是什么object,第二可以查看object的内容

object下的8d (0e41234f24b6da002d962a26c2495ea16a425f)这个称长的字符为hash的算法–SHA1

这种算法可以将文件的内容\字符串加密字符

2)git cat-file -t 8d041可以查看某个具体的git objects对象的类型

返回blob,这个git object类型是blob
blob在 git object中是用来存储文件内容

>这种算法可以将文件的内容\字符串加密字符

4)git cat-file -p 8d041可以查看某个git objects对象的内容

返回hello.git
在这里插入图片描述

通过git add可以将文件添加到缓存区,实际就会生成一些objects对象

5)git objects看到的是文件的内容,是否存储文件名?(实际不存储)

演示为什么不存储文件名:

再创建一个大小、内容、名字不同的文件tmp

在这里插入图片描述

通过git add tmp.txt右边目录没有任何变化

在这里插入图片描述

git object的哈希值不仅存储文件的内容,还存储对象object的类型

以上就可以证明git object blob只存储的是文件内容,不存储文件名,那文件名存储在哪儿呢?

3.4有了hello.txt怎么生成一个hash值呢?(固定算法)

演示
此处有一个python文件(是可以进行算出hash值)
即就会返回hash值,左边的hash值和右边的hash值完全一样
在这里插入图片描述
tmp.txt、hello.txt文件的hash值完全一样
在这里插入图片描述

3.5文件名存储在什么地方?

git object的哈希值不仅存储文件的内容,还存储对象object的类型,不存储文件名,那文件名存储在哪儿呢?
用 git status 查看状态,发现变成绿色,文件可以进行提交
在这里插入图片描述
git可以发现哪些文件是git add在缓存区中,哪些还在工作区中
在这里插入图片描述

4、git cat-file -s 8d041可以查看某个git objects对象的长度

在这里插入图片描述

三、blob对象和SHA1哈希(还没太看明白)

git add发生了什么?介绍了 git object的第一种blob,文件名是一个hash值
先了解一下算法
在这里插入图片描述

hash算法一般用在密码上面,实际md5和SHA1已经不太安全了
md5现在一般是去验证文件的完整性。

SHA1现在是在git领域使用

docker的image和contain id都是256的哈希算法

在这里插入图片描述

文件名是hash值

文件到底放了什么?
看文件的内容

在这里插入图片描述

出现了乱码,实际上git会把这个文件的原始内容做压缩,然后再存储到右边的 object中

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

原始的文件可根据ls -lh可以看到大小10B
在这里插入图片描述
进到 cd .git/objects/8d查看大小是26B,比原先大,是因为做了压缩,会存储压缩的信息,这个文件比较小,若去创建一个大一点的文本文件,再去生成object,他的这个object的大小就会小于原始的文件,是去做了一些压缩。

在这里插入图片描述

四、工作区和索引区(笔记后面没更新)

在这里插入图片描述

1、working dirctory

在这里插入图片描述

在当前的工作区创建文件或者修改文件---->通过git add命令将文件从工作区添加到索引区\缓存区(通过git add这个命令生成了对应的blob和object,通过blob object 学习,发现blob的object里并没有存储文件名的信息,只有关于对象的类型、对象的内容、对象的大小,文件名的信息在哪儿?文件名的信息在index中,在后面git repository会记录这个问题?)

2 、stageing area(缓存区、索引区)

stageing area(缓存区、索引区)是连接工作区和代码仓库,为了代码仓库做准备。
index保存了当前待提交(待commit到repository)的状态,状态就包括了文件(文件夹、目录以及每个文件所对应的什么状态,具体内容是什么)

working dirctory\stageing area里面的文件信息是有差别,这个差别在使用git status时就可以显示。

在当前阶段关于文件的信息都是在index中

2.1 echo “file1” >file1.txt && git add file1.txt

通过git add命令将文件从工作区添加到索引区\缓存区(通过git add这个命令生成了对应的blob和object,并且同时生成一个文件index

在这里插入图片描述

2.2、tree .git/

在这里插入图片描述

在这里插入图片描述

2.3、cat .git/index

可以看到index有乱码,可以大致看到文件名file1.txt
在这里插入图片描述

2.4、git ls-files查看index,可以显示当前在索引区位置的文件

在这里插入图片描述

2.5、git ls-files -s查看index,可以显示当前在索引区位置的文件名、文件信息

在这里插入图片描述

10064数字代表文件的权限,普通文件
e2129701f1a4d54dc44f03c93bca0a2aec7c5449这个代表的是文件对应的blob对象

即就是file1当前文件的内容查看blob对象(e2129701f1a4d54dc44f03c93bca0a2aec7c5449)就ok

file1.txt这个文件已经添加到索引区,这个文件在工作区和索引区的状态是一致的,通过 git status查看文件在索引区中并且是可以进行提交到代码仓库中了

在这里插入图片描述

3 、git repository

五、git commit背后到底发生了什么?

工作区(创建修改的文件)与索引区文件同步: git add
索引区是记录了当前文件的状态、包括记录了是哪些文件、文件具体的内容是什么?

如何将index(当前的文件信息)同步到远程代码仓库中?

1、准备工作

在这里插入图片描述

在这里插入图片描述

1)左边是有两个文件file1.txt,file2.txt,并且显示文件内容

2)右边是实时监控当前文件目录:每隔1s刷新文件目录

3)通过git cat-file -p ca5a 可以看到这两个文件所对应的blob对象所对应的内容,和当前在工作区中的文件内容也完全是一样的

4)通过git ls-files -s 看索引区,这两个文件的索引所对应的blob对象也是明确的
5)通过git status 看索引区和工作区的状态也是同步的

2.git commit -m "message"git commit 将index(当前的文件信息)同步到远程代码仓库中

2.1没敲完回车

在这里插入图片描述

右边目前是有三个git objects,下面是当前index所指向的file1和file2所对应的blob对象
e2129是之前的对象,这个对象可以认定是垃圾对象,目前是中间状态,是file1和file2的中间状态

在这里插入图片描述

2.2敲完回车

在这里插入图片描述

先看左边,有简单输出,
master表示在当前分支。
(root-commit) dbde7c SHA1这个hash值代表的是一次commit
root commit,第一条commit
2 files changed,2 insertions(+) 代表commit做的事情,2个文件改变,并且有两行变化。
create mode 100644 file1.txt create mode 100644 file2.txt 代表创建了10064这两个普通文件

右边最主要的是object对象
有5个object对象

已知有一个d0bde,他是一个commit git对象,这是git object中的第二种: git commint object

在这里插入图片描述

2.3通过 git cat-file -t d0bde7c可以查看git commit的类型

在这里插入图片描述

2.4通过 git cat-file -p d0bde7c可以查看git commit的内容

1)commit对象的内容

在这里插入图片描述

commit对象包含内容:
包含tree的对象,tree是git object对象的第三种内容
tree 29d3f358addb2b6e16ebfb981716fa75cc562ee7,tree后面跟的sha1的哈希值就是tree对象的文件名
author Peng Xiao xiaoquwl@gmail.com 1590009304 +0200committer Peng Xiao xiaoquwl@gmail.com 1590009304 +0200 表示本次commit的作者信息(名字、email、时间戳等)

2)tree对象

tree对象就包括了这次提交的版本、文件的状态下有哪几个文件、每个文件的文件名、每个文件名所对应的blob对象是什么

tree 29d3f358addb2b6e16ebfb981716fa75cc562ee7
tree 29d3正好是本次commit生成的第二个对象

在这里插入图片描述

① git cat-file -p d0bde7c可以查看的类型

在这里插入图片描述

② git cat-file -p d0bde7c可以查看的内容

在这里插入图片描述

内容是有两个文件,正好就说明tree代表的是目录结构

3)其他变化

git commit除了生成两个objects (commit、tree对象),还有其他的变化等

在这里插入图片描述

用tree可以查看其他变化
refs也有变化

在这里插入图片描述

① cat .git/refs/heads/master可以看到master的内容,指向d0bde

d0bde是commit对象,说明当前master分支最新的分支是d0bde
commit实际是有head
在这里插入图片描述

② cat .git/HEAD查看commit HEAD文件

HEAD文件可以理解为指针
HEAD永远指向当前的工作分支,当前的工作分支是master,即HEAD会指向master
在这里插入图片描述

若创建一个分支,并且切换到新分支上,head也会指向新分支

这个refs/heads/master是会指向一次具体的commit

3、总结

总结一下现在代码仓库的状态和涉及的git 对象
在这里插入图片描述
最上面是commit commit包含了指向具体的哪一个tree、关于作者的基本信息

tree也是对象,包含了哪些文件,一个是file1,一个是file2,这两个文件有具体的blob对象,查看各自的blob对象,都会获取到文件的内容

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值