Git 的全面解读

版本控制

什么是版本控制

我们为什么要关心它呢?版本控制是一种记录一个或若干文 件内容变化,以便将来查阅特定版本修订情况的系统

为什么要使用版本控制

软件开发中采用版本控制系统是个明智的选择。 有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某 个时间点的状态。就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以 轻松恢复到原先的样子。但额外增加的工作量却微乎其微。 你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异 问题出现的原因,又是谁在何时报告了某个功能缺陷等等。

集中化版本控制

**优点:**每个人都可以在一定程度上看到项目中的其 他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集 中化的版本控制系统; 要远比在各个客户端上维护本地数据库来得轻松容易。

**缺点:**故障时无法协同工作、写代码时不能参考版本代码和对代码进行优化。中央服务器有丢失数据的风险,

分布式版本控制

**客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。**这么一 来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本 地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份

**分布式的版本控制系统在管理项目时 存放的不是项目版本与版本之间 的差异.它存的是索引(**所需磁盘空间很少 所以每个客户端都可以放下整个 项目的历史记录)

分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:

  1. 断网的情况下也可以进行开发(因为版本控制是在本地进行的)
  2. 使用 github 进行团队协作,哪怕 github 挂了 每个客户端保存 的也都是整个完整的项目(包含历史记录的!!!)

Git 简述

Git 简史

Git 是目前世界上最先进的分布式版本控制系统。同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝 大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002 年间)。到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维 护代码。

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结 束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才 不至于重蹈覆辙。他们对新的系统制订了若干目标:

​ **分支切换速度快,容量小(压缩),简单的设计,完全分布式 **

​ **对非线性开发模式的强力支持(允许上千个并行开发的分支) **

有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设 定的目标。它的速度飞快,极其适合管理大项目,它还有着令人难以置信的非线性分支管理 系统可以应付各种复杂的项目开发需求。

Git 知识点(重要)

Git 的三个概念

工作区、暂存区、版本库

Git对象、树对象、提交对象

本地分支、远程跟踪分支、远程分支

Git 特点

直接记录快照并非差异比较

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。

近乎所有操作都是本地执行

在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。

保证完整性

Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。

一般只添加数据

执行的 Git 操作,几乎只往 Git 数据库中增加数据。

三种状态

已提交(committed)、已修改(modified)和已暂存(staged)

工作流程

每个项目都有一个 Git 目录(.git )它是 Git 用来保存元数据和对象数据库 的地方。

一、在工作目录中修改某些文件。
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作 目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来 的,接下来就可以在工作目录中对这些文件进行编辑。

二、保存到暂存区域,对暂存区做快照
暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们 会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。

三、提交更新
将保存在暂存区域的文件快照永久转储到本地数据库(Git 目录) 中

我们可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版 本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存 状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

分支的本质

分支的本质就是一个提交对象,所有的分支都会有机会被HEAD所引用。当我们有新的提交的时候,HEAD会携带当前持有的分支往前移动

远程协作

**三大概念:**本地分支、远程跟踪分支(remote/分支名)、远程分支

基本流程

第一步: 项目经理创建一个空的远程仓库
第二步: 项目经理创建一个待推送的本地仓库
第三步: 为远程仓库配别名  配完用户名 邮箱
第四步: 在本地仓库中初始化代码 提交代码
第五步: 推送
第六步: 邀请成员
第七步: 成员克隆远程仓库
第八步: 成员做出修改
第九步: 成员推送自己的修改
第十步: 项目经理拉取成员的修改

克隆仓库时 会自动为master做跟踪

Git 安装&配置

git 地址 : https://git-scm.com/download/win,下载完安装包之后,双击 exe 安装包,可以看到如下图窗口界面,一直点击下一步,就安装完成了

Git Base Here基础命令

清除屏幕clear

用户设置

用户名称:git config --global user.name "[name]"
用户邮箱:git config --global user.email [email]
检查已有的配置信息:git config --list
删除配置信息: git config --global --unset user.email

/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
.git/config 文件:当前项目的 Git 目录中的配置文件(也就是工作目录 中的 .git/config 文件)这里的配置仅仅针对当前项目有效。

Git 底层概念(底层命令)

基础的 linux 命令

git --version查看版本
clear :清除屏幕
echo 'test content':往控制台输出信息 echo 'test content' > test.txt 输出文件
ll :将当前目录下的 子文件&子目录平铺在控制台
find 目录名: 将对应目录下的子孙文件&子孙目录平铺在控制台
find 目录名 -type f :将对应目录下的文件平铺在控制台
rm 文件名 : 删除文件 mv 源文件 重命名文件: 重命名
cat 文件的 url : 查看对应文件的内容
vim 文件的 url(在英文模式下)
按 i 进插入模式 进行文件的编辑
按 esc 键&按:键 进行命令的执行
q! 强制退出(不保存)
wq 保存退出
set nu 设置行号

初始化新仓库

执 行:git init,对现有的某个项目开始用 Git 管理,只需到此项目所在的目录

作用:初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要 的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化 好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。

.git目录

hooks 目录包含客户端或服务端的钩子脚本;
info 包含一个全局性排除文件
logs 保存日志信息
objects 目录存储所有数据内容;
refs 目录存储指向数据的提交对象的指针(分支)
config 文件包含项目特有的配置选项
description 用来显示对仓库的描述信息
HEAD 文件指示目前被检出的分支
index 文件保存暂存区信息

Git 三大基础对象

Git对象

向数据库写入内容 并返回对应键值

命令: echo 'test content' | git hash-object -w --stdin
-w 选项指示 hash-object 命令存储数据对象;若不指定此选项,则 该命令仅返回对应的键值
-stdin(standard input)选项则指示该命令从标准输入读取内容; 若不指定此选项,则须在命令尾部给出待存储文件的路径

存文件:git hash-object -w 文件路径
返回文件对应键值:git hash-object 文件路径
根据键值拉取数据:git cat-file -p [filehash]
-p 选项可指示该命令自动判断内容的类型,并为我们显示格式友好的内容

记住文件的每一个版本所对应的 SHA-1 值并不现实,且在 Git 中,文件名并没有被保存——我们仅保存了文件的内容

[^注意 ]: 当前的操作都是在对本地数据库进行操作 不涉及暂存区

树对象

树对象(tree object),它能解决文件名保存的问题,也允许我们将多个文件 组织到一起。Git 以一种类似于 UNIX 文件系统的方式存储内容。所有内容均以 树对象和数据对象(git 对象)的形式存储,其中树对象对应了 UNIX 中的目录项, 数据对象(git 对象)则大致上对应文件内容。一个树对象包含了一条或多条记录(每条记录含有一个指向 git 对象或者子树对象的 SHA-1 指针,以及相应的模式、类 型、文件名信息)。一个树对象也可以包含另一个树对象。

构建树对象

我们可以通过 update-indexwrite-treeread-tree 等命令来构建 树对像并塞入到暂存区。

利用 update-index 命令 为 test.txt 文件的首个版本——创建一个 暂存区。并通过 write-tree 命令生成树对像。
git update-index --add --cacheinfo 100644 83baae61804e65cc73a7201a7252750c76066a30 test.txt

文件模式: 100644,表明这是一个普通文件
100755,表示一个可执行文件
120000,表示一个符号链接。

**–add 选项:**因为此前该文件并不在暂存区中 首次需要—add

**–cacheinfo 选项:**因为将要添加的文件位于 Git 数据库中,而不是位于当前 目录下 所有需要—cacheinfo

查看暂存区:git ls-files -s
查看树对象:git cat-file -p master^{tree}(或者是树对象的 hash)
暂存区生成树对象存入库:git write-tree

新增 new.txt 将 new.txt 和 test.txt 文件的第二个版本塞入暂存区。并通过 write-tree 命令生成树对像。

echo 'new file' > new.txt 
git update-index --cacheinfo 100644 / 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt 
git update-index --add new.txt git write-tree 

将第一个树对象加入第二个树对象,使其成为新的树对象

git read-tree --prefix=bak 06e21bb0105e2de6c846725a9a7172f57dd1af96

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqXkK5Z3-1592755764815)(https://github.com/TuiMao233/Learning_code/blob/master/00_笔记目录/img/Git/最后的树对象.png?raw=true)]

现在有三个树对象(执行了三次 write-tree),分别代表了我们想要跟踪 的不同项目快照。然而问题依旧:若想重用这些快照,你必须记住所有三个 SHA-1 哈希值。 并且,你也完全不知道是谁保存了这些快照,在什么时刻保 存的,以及为什么保存这些快照。而以上这些,正是提交对象(commit object) 能为你保存的基本信息

提交对象

我们可以通过调用 commit-tree 命令创建一个提交对象,为此需要指定一个树 对象的 SHA-1 值,以及该提交的父提交对象(如果有的话 第一次将暂存区做快 照就没有父对象)

创建提交对象:echo 'first commit' | git commit-tree [树哈希] 返回:fdf4fc3344e67ab068f836878b6c4951e3b15f3d

查看提交对象:git cat-file -p [提交对象哈希]

提交对象的格式很简单: 它先指定一个顶层树对象,代表当前项目快照;然后是作者/提交者信息(依 据你的 user.name 和 user.email 配置来设定,外加一个时间戳);留空 一行,最后是提交注释

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6lqdPZv-1592755764818)(https://github.com/TuiMao233/Learning_code/blob/master/00_笔记目录/img/Git/提交对象视图.png?raw=true)]

Git 操作命令集

创建工作目录 对工作目录进行修改

  1. git add ./ 将目录下所有文件进行以下操作(存入项目对象,在存入暂存区)
    git hash-object -w 文件名 (修改了多少个文件目录中的文件,次命令就要被执行多少次)
    git ipdata-index .... (存入暂存区)
  2. git commit -m "注释内容" 暂存区存入数据库,并对应创建树对象,提交对象
    git write-tree 创建树对象
    git commit-tree 提交对象

存文件:git hash-object -w 文件路径
返回文件对应键值:git hash-object 文件路径
根据键值拉取数据:git cat-file -p [filehash]

查看暂存区:git ls-files -s
查看树对象:git cat-file -p master^{tree}(或者是树对象的 hash)
暂存区生成树对象存入库:git write-tree

初始化仓库:git init
检查当前文件状态:git status

将修改添加到暂存区: git add ./
查看哪些更新还没有暂存:git diff(不加参数直接输入 git diff)
查看哪些更新已暂存准备下次提交:git diff –cached 或者 git diff –staged(1.6.1 以上)
检查当前文件状态:gi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值