学习git第二天:git简介、安装和基本命令

本文主要内容包括对git简介,发展历史,安装,以及针对git区域(工作区域,暂存区域和版本库区域)和对象(git对象,树对象和提交对象)两个方面的介绍

git简介和安装

-、git简介

Git是目前世界上最先进的分布式版本控制系统,Git是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。Git最初是由LinusTorvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件

1.1 历史

同生活中的许多伟大事件一样,Git诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。
绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。
到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper的权力。
这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。
他们对新的系统制订了若干目标:速度简单的设计对非线性开发模式的强力支持(允许上千个并行开发的分支)
完全分布式有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
自诞生于 2005 年以来,Git日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标:分支切换速度快,容量小(压缩)、简单的设计、完全分布式、对非线性开发模式的强力支持(允许上千个并发)
有能力搞笑管理类似linux内核一样的超大规模项目()
它的速度飞快,极其适合管理大项目,它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求。

二、git安装

 参考:http://git-scm.com/

2.1、git配置

2.1.1、 配置用户名称
  `git config --global user.name "XXX"`
2.1.2、 配置邮箱地址
  `git config --global user.email xxx@xxx.com`
2.1.3、 检查配置是否正确
   `git config --list`

三、底层概念

3.1、区域

3.1.1、工作区

本地代码,当前项目,沙箱环境,git不做管理

3.1.2、暂存区

可以存放多步骤的commit修改

3.1.3、版本库

暂存区的多个commit可以最后通过push提交到版本区

3.2、对象

3.2.1、Git对象
key:val 组成的键值对(key是val val存储blob)
  1. 在指定文件目录下创建git对象
    git init
    会生成一个.git文件夹,改文件是隐藏文件
  2. hooks: 包含客户端或服务的钩子脚本,在命令执行前后会进行的一些动作或检查类似UI交互事件的回调函数。
  3. info:包含一个全局性配出文件 。
  4. logs:保存日志信息,使用的时候才会自动生成
  5. objects:目录存储所有数据内容,相当于数据库
  6. refs: 目录存储指向数据(分支)的提交对象的指针
  7. config: 文件包含项目特有的配置选项,local级别(项目级别)的配置会被存放到这里
  8. description:用来显示对仓储的描述信息
  9. HEAD:文件只是目前被检查出的分支
  10. index:文件保存暂存区信息,想暂存区存放内容是,才会自动生成。
git底层命令
 git的核心部分是一个简单的键值对数据库,可以往改数据库中插入任意类型内容,他会返回一个键值,通过改键值可以在任意时刻再次检索改内容
  1. 向数据库写入内容,并返回对应键值
    echo 'test content' | get hash-object -w --stdin
    -w 选项指示 hash-object 命令存储数据对象,若不指定此选项,则该命令则返回对应的键值
    –stdin 选项指示该命令从标准输入读取内容,如果不指定该选项,则需在命令为不给出带存储文件路径
    如果存放文件到数据库中则执行如下命令
    git hash-object -w 文件名称
  2. 查看git是如果存储数据的
    find .git/objects -type f
    输出了相关存储内容
    一个文件对应一条内容,字符窜前两位表明目录,剩余的38个字符则用做文件名称
  3. 根据键值拉去数据
    git cat-file -p 键值
    -p 选项可指示该命令自动判断内容的类型,并未我们显示格式有好的内容返回
  4. 问题
    记住文件的每一个版本所对应的SHA-1值并不现实
    在git中,文件名并没有被保存–只保存了文件内容
  5. 以上的命令操作都是在对本地数据库进行操作,不涉及到暂存区
  6. git对象,只针对内容作了保存
3.2.2、树对象
   数对象(tree object) 他能解决文件名保存问题,也允许我们将多个文件组织到一起,
   git一一种类似UNIX文件系统的方式存储内容,所有内容均已数对象和数据对象(git
   对象)的形式存储,其中数对象对应了UNIX中的目录项,
   数据对象(git 对象)则大致上对应文件内容,一个树对象包含了一条或多条记录
   (每条记录含有一个指向git独享或者子树对象的SHA-1指针,以及相对应的模式、类型,文件名信息)。一个树对象也可以包含另一个树对象
   我们可以通过update-index;write-tree;read-tree等命令来构建树对象并塞入到暂存区。
   操作如下:
  1. 利用update-index 命令为 test.txt 文件的首个版本-创建一个暂存区,并通过write-tree 命令生成树对象
1
git update-index --add -cacheinfo  100644\

文件模式为: 100644,表明这是一个普通文件
100755, 标识一个可执行文件
120000. 标识一个符号链接
–add 选项:因为此钱该文件并不在暂存区,首次需要–add
–cacheinfo 选项 因为将要添加的文件位于git数据库中,而不是当前目录下,所有需要–cacheinfo
2. 新增new.txt,将new.text 和test.txt 文件的第二个版本塞入暂存区,并通过write-tree 命令生成数对象

1
2
3
git update-index --cacheinfo 100644
git updae-index -add new.text
git write-tree
  1. 将第一个树对象加入到第二个树对象,使其成为新的数对象
1
2
3
git read-tree -prefix

git write-tree

read-tree命令,可以将树对象读入暂存区

  1. 查看暂存区当前的样子
    git ls-files -s
  2. 查看数对象,命令
    git cat-file -p master^{tree}
    master^{tree} 语法标识,master分支上最新的提交所指向的树对象

***** 可以认为树对象就是我们项目的快照

3.2.3、提交对象

我们可以通过调用commit-tree 命令创建一个提交对象,为此需要制定一个树对象SHA-1值,以及该提交的父提交对象(如果有的话,第一次将暂存区做快照就没有父对象),主要是为了记录当前提交人的信息,时间等

  1. 创建提交对象
1
echo '第一次提交' | git commit-tree ccbaf
  1. 查看提交对象
1
git cat-file -p fdedc
  1. 提交对象格式
    提交对象的格式很简单,他先指定一个顶层树对象,代表当前项目快照,然后是作者/提交信息(根据user.name 和user.email 配置来设定,外加一个时间戳);留空一行,最后就是提交注释了
    接着,我们将创建另两个提交对象,他们分别引用各自的上一个提交(作为父提交对象)
    git commit-tree 不但生成提交对象,而且会将对应的快照(树对象)提交到本地库中

3.3、基础的linux命令

  1. clear:清除屏幕
  2. echo ‘test content’ :往控制台输入信息
  3. II:将当前目录下的子文件和子目录平铺在控制台
  4. find 目录名:将对荧幕里下的子文件和子孙目录平铺在控制台
  5. find 目录名 -type f:将对应目录下的文件平铺在控制台
  6. rm 文件名:删除文件
  7. mv 源文件 重命名文件: 重命名
  8. cat 文件的url:查看对应文件的内容
  9. vim 文件的url