1、简介
Git 是分布式版本控制和源代码管理系统,重点使用和管理代码的速度。 Git 最初是由 Linus Torvalds 设计开发的,用于管理 Linux 内核开发。Git 是根据 GNU 通用公共许可证版本 2 的条款分发的自由 / 免费软件。
官方网址:Git
1.1 定义
Workspace:工作区
Index/Stage:暂存区,也叫索引
Repository:仓库区(或本地仓库),也叫存储库
Remote:远程仓库
工作区:通过
git init
创建的代码库的所有文件但不包括.git
文件(版本库);暂存区:通过
git add ./*/*Xxx/Xxx*
添加的修改,都是进入到暂存区,通过git status
可以看到修改的状态。
1.2 关于版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
本地版本控制系统
采用某种简单的数据库来记录文件的历次更新差异。
例:RCS
命令:在硬盘上保存补丁集(补丁:文件修订前后的变化),通过应用所有的补丁, 可以重新计算出各个版本的内容。
集中化的版本控制系统
为了在不同系统上的开发者协同工作,Centralized Version Control Systems,简称 CVCS ,应运而生。 这类系统,诸如 CVS*、*Subversion(SVN) 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
优点:每个人在一定程度上可看到其他人在项目中的工作,管理员也轻松掌握开发者的权限,
且管理一个 CVCS 要比维护数据库更容易;
缺点:中央服务器可能存在单点故障。
分布式版本控制系统
Distributed Version Control System,简称 DVCS 。在这类系统中,像 Git*、Mercurial、*Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。由此,任何一处服务器发生故障都可以用任何一个镜像出来的本地仓库进行恢复。
因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
1.3 基础原理
1.3.1 直接记录快照,非差异比较
和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。
概念上,其他大部分系统以文件变更列表的方式存储信息,将保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异,如下:
1. Git 更像是把数据看作是对小型文件系统的一组快照。
2. 每次提交更新或保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不在重新存储该文件,而是只保留一个链接指向之前存储的文件。Git 对待数据更像是一个
快照流
。如下:
1.3.2 几乎所有操作都是本地执行
在 Git 中的绝大多数操作都只需要访问本地资源,一般不需要来自网络上其它计算机的信息。
1.3.3 保证完整性
Git 中所有数据在存储前都计算校验和,然后以校验和来引用。
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9
和 a-f
)组成字符串,基于 Git 中文件的内容或目录结构计算出来。
实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
1.3.4 一般只添加数据
执行的 Git 操作几乎只往 Git 数据库中增加数据,很难执行任何不可逆操作或清除数据。
1.3.5 三种状态、三个区域
Git 有三种状态:
-
已提交(commited):表示数据已经安全的保存在本地数据库中;
-
已修改(modified):表示修改了文件,但还没保存到数据库中;
-
已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
Git 的三个工作区域:
-
Git 仓库:用来保存项目的元数据和对象数据库,是 Git 最重要的部分,克隆仓库时,拷贝的就是这里的数据;
-
工作目录:对项目的某个版本独立提取出来的内容从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供使用或修改;
-
暂存区域:是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中,也称为“索引”;
1.3.6 工作流程
-
在工作目录中修改文件;
-
暂存文件,将文件的快照放入暂存区域;
-
提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录中。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。
如果作了修改并已放入暂存区域,就属于已暂存状态。
如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
2、配置
Git 自带一个 git config
的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
-
/etc/gitconfig
文件: 包含系统上每一个用户及他们仓库的通用配置。如果使用带 有--system
的git config
时,会从此文件读写配置变量。 -
~/.gitconfig
或~/.config/git/config
文件:只针对当前用户。 可以传递`--global` 让 Git 读写此文件。 -
当前(
.git/config
):针对该仓库。
每一个级别覆盖上一级别的配置,所以
2
的配置变量会覆盖1
中的配置变量。
2.1 用户信息
设置用户名称和右键地址,因为每一个 Git 的提交都会使用这些信息并写入到每一次提交当中,不可更改:
$ git config --global user.name "xxxx"
$ git config --global user.email xxxxxxx@qq.com
--global
运行一次后,今后 Git 都会使用这些信息。
2.2 文本编辑器
配置(Mac)默认文本编辑器 emacs ,当 Git 需要您输入信息时会调用它。
$ git config --global core.editor emacs
Git 会使用操作系统默认的文本编辑器,(Linux)通常是
Vim
。
2.3 检查配置信息
使用 git config --list
命令来列出所有 Git 当时能找到的配置:
$ git config --list
diff.astextplain.textconv=astextplain
http.sslbackend=openssl
core.autocrlf=true
core.fscache=true
core.symlinks=true
pull.rebase=false
...
输出结果中,可能会有重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig
与 ~/.gitconfig
)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。
可以通过输入 git config <key>:
来检查 Git 的某一项配置:
$ git config user.name
2.4 获取帮助
Git 命令的使用手册:
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
// 如获得 `config` 命令手册:
$ git help config
3、快速搭建
4、工作流程
通过 Git 的生命周期对 Git 的一般工作流程进行说明,如下:
-
将 Git 的一个存储库克隆为工作副本;
-
可以通过添加、编辑文件修改工作副本;
-
可以通过让其他人员的介入来更新、更改工作副本;
-
在提交之前查看更改内容;
-
提交更改,进行推送,将更改推送到存储库;
-
提交后,若意识到某些错误并修改后,则将最后一个正确的修改提交并将推送到存储库。