likes
comments
collection
share

git版本控制(一):基本流程和原理

作者站长头像
站长
· 阅读数 4

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

git安装

git官网下载安装包(已window为例,mac安装步骤差不多,可自行百度),如下图:

git版本控制(一):基本流程和原理

点击 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 的版本库。 git版本控制(一):基本流程和原理

1、在文件内初始化git(创建git仓库)或者远程克隆仓库

如果是自己新建的项目,进入需要管理项目的根目录,然后执行git init命令。

如果是远程克隆仓库,执行git clone 远程仓库地址即可。

git版本控制(一):基本流程和原理

2、查看文件的状态

执行git status可查看文件状态。 对于任何一个文件,在 Git 内都只有三种状态:已提交(committed)已修改(modified)已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库 中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

3、将文件放置到暂存区

在执行 git add 文件名这个命令之前,文件的状态是已修改,如下图:

git版本控制(一):基本流程和原理

在执行命令之后,文件的状态是已暂存,如下图:

git版本控制(一):基本流程和原理

4、将文件从暂存区提交到仓库

执行git commit -m 描述内容命令提交到本地仓库。

git版本控制(一):基本流程和原理

5、修改已提交过的文件

依次执行git add 文件名 -> git commit -m 描述内容即可

6、将本地仓库提交的远程仓库

如果是自己新建的项目,首先需要关联自己的远程仓库(github或者gitlab都可以),执行命令git remote add 仓库名(自己命名) 仓库地址(远程链接)即可,然后 git push -u 仓库名 分支名

如果是远程克隆的仓库,执行git push -u 仓库名 分支名即可。

git版本控制(一):基本流程和原理

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版本控制(一):基本流程和原理

  • git commit 先将缓存区的内容创建一个树对象(版本快照),然后创建一个提交对象。 git版本控制(一):基本流程和原理