git版本控制(一):基本流程和原理
什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
git安装
到git官网下载安装包(已window为例,mac安装步骤差不多,可自行百度),如下图:
点击 Download 2.30.1 for Windons
下载并且安装即可。
然后命令行执行 git version
,若正常显示版本号,证明安装成功。
git初始化配置
在git安装成功之后,我们要配置git的用户信息,这个很重要。每次我们在提交的时候都会引用用户信息,说明是谁提交了更新。
// 配置用户名
git config --global user.name 'aoteman'
// 配置用户邮箱
git config --global user.email 'aoteman@qq.com'
// 要检查已有的配置信息
git config --list
到现在为止,初始化配置完成。
git三大工作区域和工作流程
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
1、在文件内初始化git(创建git仓库)或者远程克隆仓库
如果是自己新建的项目,进入需要管理项目的根目录,然后执行git init
命令。
如果是远程克隆仓库,执行git clone 远程仓库地址
即可。
2、查看文件的状态
执行git status
可查看文件状态。
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed)
,已修改(modified)
和已暂存(staged)
。已提交表示该文件已经被安全地保存在本地数据库 中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
3、将文件放置到暂存区
在执行 git add 文件名
这个命令之前,文件的状态是已修改
,如下图:
在执行命令之后,文件的状态是已暂存
,如下图:
4、将文件从暂存区提交到仓库
执行git commit -m 描述内容
命令提交到本地仓库。
5、修改已提交过的文件
依次执行git add 文件名
-> git commit -m 描述内容
即可
6、将本地仓库提交的远程仓库
如果是自己新建的项目,首先需要关联自己的远程仓库(github或者gitlab都可以),执行命令git remote add 仓库名(自己命名) 仓库地址(远程链接)
即可,然后 git push -u 仓库名 分支名
。
如果是远程克隆的仓库,执行git push -u 仓库名 分支名
即可。
git内部原理
由于 Git 最初是一套面向版本控制系统的工具集,而不是一个完整的、用户友好的版本控制系统, 所以它还包含了一部分用于完成底层工作的子命令。 这些命令被设计成能以 UNIX 命令行的风格连接在一起,抑或藉由脚本调用,来完成工作。 这部分命令一般被称作“底层(plumbing)”命令,而那些更友好的命令则被称作“上层(porcelain)”命令。
git对象
Git 的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。
但是git
对象存在两个问题,第一个就是记住文件的每一个版本所对应的 SHA-1 值并不现实,第二个问题就是在这个(简单的版本控制)系统中,文件名并没有被保存——我们仅保存了文件的内容。所以就有了下面的解决方案树对象
。
树对象
它能解决文件名保存的问题,也允许我们将多个文件组织到一起。 Git 以一种类似于 UNIX 文件系统的方式存储内容,但作了些许简化。 所有内容均以树对象和数据对象的形式存储,其中树对象对应了 UNIX 中的目录项,数据对象则大致上对应了 inodes 或文件内容。 一个树对象包含了一条或多条树对象记录(tree entry),每条记录含有一个指向数据对象或者子树对象的 SHA-1 指针,以及相应的模式、类型、文件名信息。
git对象到树对象有个过程:
首先是创建一个一个的git对象,
然后把一个一个的树对象添加到缓存区里面(git update-index),
最后执行(git write-tree)创建一个树对象。
一个树对象就是一个版本快照。
然而问题依旧:若想重用这些快照,你必须记住所有三个 SHA-1 哈希值。 并且,你也完全不知道是谁保存了这些快照,在什么时刻保存的,以及为什么保存这些快照。 而以上这些,正是提交对象(commit object)能为你保存的基本信息。
提交对象
可以通过调用 commit-tree 命令创建一个提交对象,为此需要指定一个树对象的 SHA-1 值,以及该提交的父提交对象(如果有的话)。
提交对象是对树对象的封装(描述更加具体),真正代表一个项目版本的还是树对象,而git对象仅代表一个文件的版本。
在git版本控制当中,最重要的就是这三个对象,git对象
,树对象
,提交对象
具体的底层命令和实现请参考git文档
一些上层命令的底层原理
- git add
首先创建了一个
git对象
添加到本地版本库里面,然后将git对象
添加到缓冲区。
比如现在我创建了一个文件version.html,底层执行命令如下:
- git commit
先将缓存区的内容创建一个树对象(版本快照),然后创建一个提交对象。
转载自:https://juejin.cn/post/6929439197954572302