git教程:
是一种版本控制器,是一个记录每一次版本记录一个或若干个文件内容的变化,以便将来查询特定版本修订情况的系统。
可以通过它恢复之前的样子,可以一键还原
可以通过比较文件的变化细节,可以找到谁修改了这段代码,这是一种分布式的版本控制器,操作要比SVN复杂一点。
集中式的管理的优缺点:(代码存储在单一的服务器上便于项目的管理,客户端只提取最新版本的快照)
优点:
集中化的管理
方便存储
缺点:
中央出现故障,没有保障。(SVN服务器宕机就不能工作了;需要手动保存代码,如果恢复之前版本会出现丢失数据,或者时间一长就无法找到完整的之前代码的对照);
如果中央存储出现问题,那么版本无法恢复管理。
分支操作麻烦需要到服务器端拉分支再从客户端接入
分布式的管理的优缺点
(可以提取不只是最新版本的快照,而是存储仓库完整的镜像。可以通过其他本地的服务器(可以都是客户端)完整的保存下来)(可以没有网络的情况下开发,因为本地有历史记录)
分布式的管理存放的不是项目版本与版本之间的差异,它存的是索引(所需的磁盘空间较小很多时候都是存索引,有时候会存压缩文件)所以每个客户端都可以放下整个项目的历史记录;
列如:有100次存储那么SVN需要一步一步的回滚,GIT需要存储所有的索引,可以一步回到对应版本
SVN每次存储的内容会小一点(内存要求要小一些),但恢复历史版本会麻烦一点
GIT每次存储的都是这个项目完整的快照,(内存要求要大一点,但做过压缩内存不会大很多),但是恢复历史版本要快一点(可以加内存,但是很难加CPU所以选择GIT更好)
使用GITHUB客户端进行GIT操作;
可以客户端自己创建分支更加便捷
GIT简史:
linux开发者linux torvalds参与开发
(linux内核维护工作很多都花在了提交补丁和保存归档的繁琐)
其实很多大型项目都借助了操作系统的模式,GIT可以采用分布式管理超大型项目,有点类似于LINUX同时支持多用户进行操作。
下载地址:
https://git-scm.com/download/win
https://git-scm.com/download/mac
git初始化过程(第一次使用)需要配置一下工作环境:
Git config --global user.name”名字”
Git config --global user.email 945571214@qq.com(邮箱)
这里的邮箱代表在git上提交版本的时候上面的邮箱,如果出现代码出现错误,可以通过邮箱提醒编写者
Git config --list
查看可以配置的信息,可以通过提示进行配置
--global当前用户提交
--system当前系统提交
不填 当前系统提交
git教程主要内容:
区域&对象
区域:
工作区、暂存区、版本区
对象:
git对象、树对象、提交对象
工作区:在工作区中新建文件、修改文件等等,(沙箱环境、临时生成的环境)
暂存区:暂时存放文件的地方(并不是所有的文件都需要创建一个版本)
版本区:最终版本
工作区提交到暂存区,暂存区达到一定程度,提交到版本区
git对象:
初始化对象:到工作区文件夹中使用gitbash here创建了一个隐藏的git文件夹,这个就是git仓库,里面就是版本库,在这个工作区文件中的所有操作都会存放在这个文件夹中。
Git init:初始化对象命令
里面包含多个文件夹表示不同的含义:
hooks目录包含客户端或服务端的钩子脚本(相当于一钟回调函数,符合规范提交不符合则不能提交(工作区向缓存区提交的钩子,缓存区向版本库提交的钩子))
Info:表示git不需要管理的文件
Logs:使用git产生的日志信息
Objects:目录存储所有的数据内容
Refs:存放提交对象(分支有关)
config配置文件(user 和email存储的文件)
Description:对仓库的描述信息
HEAD表示当前被检出的分支
index文件保存的暂存区
inux基本命令:
clear清除屏幕
Echo “testcommend” > test.txt创建文件
Ll:将当前目录下的子文件&子目录平铺到控制台
Find:将对应目录的子孙目录输出到工作台
Find -type f:查看对应文件类型的文件
Rm 删除文件
Mv 原文件 更改之后的名字 更改文件名
Cat 文件查看文件内容
Vi 修改文件内容set nu 设置行号
底层命令(弄清原理就行了,不需要特别记忆)
Git对象:
Key:val(Key:val生成的hash是blob类型的键值对hash-object)
git的核心部分是一个简单的键值对数据库,你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任何时刻再次检索该内容
向数据库中写入内容 并返回对应键值:
Echo “test content” |git hash-object -w --stdin(可替换成文件路径)
-w选项是指hash-object命令存储数据对象,若不指定此选项则该命令是返回对应的键值
--stbin(标准输入standar input)选项则指示该命令从标准库读取内容;若不指定则默认返回指定路径
(数据库的内容对应一个键值hash(唯一一个)头两个字符表示存储的目录(objects下的子目录)通过cat 查看会发现这里面的存储的内容被压缩了)
查看原内容:git cat-file -p hash值(git存取时生成出来的hash键)(查看压缩之后的内容)
-p自动指示命令中自动判断内容的类型,并为我们现实格式友好的内容
(换成-t可以查看git对象的类型-------blob类型)
(lf是Windows的换行 crlf是Linux的换行)
编写一个文件
Echo “hello a1” > hello.txt
Git hash-object -w hello.txt
生成第一个键值对
Echo “hello a2” >> hello.txt
Git hash-object -w hello.txt
生成第二个键值对
第一个和第二个之间会有重复内容,但是内容都经过压缩
Git cat-file -p hello.txt的hash键(第二个的hash键)
Hello a1hello a2
以上是对本地数据库进行管理不涉及缓存区
记录的版本不是文件的更新的版本,而是整个更新项目的版本
而且在git中文件名并没有被保存 我们仅保存了文件的内容
解决方案:树对象
树对象:
树对象,它能解决文件名保存的问题,也允许我们将多个文件名组织到一起,git以一种类似于unix文件系统的方式存储内容。所有内容均以树对象和数据对象(GIT对象)存储,其中树对象对应了Unix中的目录项,数据对象(git对象)则大致对应文件内容。一个树对象包含了一条或多条记录(每条记录含有一个指向git对象或者子树对象的sha-1指针。以及相应的模式,类型,文件名信息)。一个树对象也可以包含另一个树对象。