git 分布式版本控制系统
目的:管理文件内容的变化
一、优点:
1.分布式开发
并行开发,每个人在自己独立的版本库中同时开发,不需要与中心版本库时刻同步
2.性能优异
为了节约传输时间和存放空间,使用“压缩”和“差异比较”技术;分布式开发也确保了网络的不确定不会影响日常开发
3.保持完整性和可靠性
使用安全散列函数SHA1来命名和识别对象库中对象
二、概念解释:
(1) 版本库
是一个简单的数据库,包含用户用来维护与管理项目的修改版本和历史信息。提供所有版本库中文件的副本,和版本库本身的副本
Git主要数据结构:对象库和索引
(2)对象库
又称内容寻址系统,只有四种类型:
块(blob:binary large object):文件的每一个版本都表示一块blob,只有文件的内容,不含元数据
目录树(tree):记录blob标识符、路径名和一个目录所有文件的元数据
提交(commit):保存版本库中每一次变化的元数据,包括作者、提交者、提交日期和日志信息
标签(tag):方便人读的特定对象,通常是一个提交对象。分为轻量级(提交对象的引用)和带附注(在版本库中创建永久对象)
(3)索引
一个临时的、动态的二进制文件,描述整个版本的目录结构
三、对象库具体变化
(树对象即目录树)
(1)一个文件从添加到提交的过程
git init
echo "hello" > hello.txt
git add . //对象库中创建blob对象
git write-tree //根据当前的索引在对象库中创建一个树对象
git commit -m 'add hello' //对象库中创建树对象和提交对象
标签
带附注的标签
git tag -m 'tag version 1.0' v1.0 提交对象ID //对象库中创建标签对象
$ git rev-parse v1.0 //获取标签对象的散列值SHA1
5edaf4b2307afad2702e8d6375cedc6ad1c68235 //标签对象ID
git cat-file -p v1.0 //查看标签对象的内容
轻量级标签
git tag v2.0 884ff6294901aefe0b80638292a236e48a783a52 //对象库中没变化
git rev-parse v2.0
884ff6294901aefe0b80638292a236e48a783a52 //提交对象ID
查看hello.txt提交后的仓库变化
$ find .git/objects/
.git/objects/
.git/objects/5e
.git/objects/5e/daf4b2307afad2702e8d6375cedc6ad1c68235 //标签对象
.git/objects/88
.git/objects/88/4ff6294901aefe0b80638292a236e48a783a52 //提交对象
.git/objects/aa
.git/objects/aa/a96ced2d9a1c8e72c56b253a0e2fe78393feb7 //树对象
.git/objects/ce
.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a //hello.txt的blob对象
.git/objects/info
.git/objects/pack
查看ID对应的内容:
以树对象为例
git cat-file -p aaa96ced2d9a1c8e72c56b253a0e2fe78393feb7
100644 blob ce013625030ba8dba906f756967f9e9ca394464a hello.txt
具体对象库中变化如图所示:
(2)在添加一个目录和一个文件
mkdir test
echo "what" > test/test.txt
git add .
git commit -m "add test"
提交后对象库中新增一个提交对象、两个树对象、一个blob对象。
具体变化如图所示:
注意:Git追踪的是内容,不是文件
当在cp hello.txt test/hello.txt时,不会创建新的blob块,只有当其中一个内容变化时才新建blob块
主要命令
git cat-file -p ID //查看ID对应的信息(不同对象对应不同内容)
git rev-parse 3211882d //根据唯一前缀查看完整的散列值
git ls-files -s //查看当前索引
git write-tree //根据当前索引创建树对象
git rev-parse v1.0 //根据标签名查看标签队形散列值