今天分享Git
的入门内容,包括:版本控制系统的介绍、Git
的简单历史、不同系统中安装Git
的方法以及Git
的相关初始配置。接下来开始今天的内容吧。
1 关于版本控制
Git
是现在最流行的版本控制系统,甚至没有“之一”这中说法。大家在使用Git
的时候,有没有想过版本控制系统是什么,我们为什么有需要它呢?
顾名思义,版本控制系统本质上一套系统,在这个系统里,按照时间顺序记录某个或一系列文件的变更,并且支持查看之前的系统。
在项目开发中使用版本控制系统可以为我们带来如下的好处:
- 协同合作:使用版本控制系统可以在开发团队中高效地分享文件,支持对任何团队成员在任何时间、任何设备上对任何文件进行的修改进行高效的合并,最后形成统一的版本
- 恢复之前的版本:使用版本控制系统可以很方便的回复到上一个已测试过的系统版本
- 备份:使用分布式的版本控制系统,团队每个成员都可以在本地有一个完整项目的副本,如果
Git
服务器损坏,可从团队成员的本地仓库中得要 - 记录发生过什么:使用版本控制系统,当对团队项目提交任何更改时,需提供对这个修改的简短描述,这样可以记录下版本之间的发展关系
版本控制系统的发展经历了本地版本控制系统、集中式版本控制系统和分布式版本控制系统,本篇文章不介绍每个阶段的详细历程,感兴趣的朋友可以查查网络资料或在书里查看。大家在这需要需要了解的几点是:
- 每个阶段都有其经典的版本控制系统,
RCS
是本地版本控制系统的常用工具,SVN
是集中式版本控制系统的常用工具,Git
是分布式版本控制系统的常用工具 - 分布式版本控制系统是当下最流行的版本控制系统,但在有些情况下,本地版本控制系统和集中式版本控系统也有使用,例如:在
Mac OS X
系统中,只要安装开发者工具,就会包含一个rcs
命令
2 Git的简单历史
Git
的诞生伴随着Linux
的发展,是Linux
的第二个伟大的作品。关于Linux
和Git
的故事是这样的:
集中式版本控制系统出名的两个工具:CVS
和SVN
,分别诞生于1985年和2000年,Linux
系统是1991年发布的。大家都知道,Linux
系统内核是一个超大规模的开源软件的项目,按照我们的想法,管理这么大的项目需要一个版本控制系统,但是在Linux
系统之父对于CVS
和SVN
这些系统“不感冒”,反对在Linux
项目中使用这些系统。在1991年到2002年这段时间内容,他们团队成员之间通过传递补丁和归档文件来实现对代码的维护。
随着Linux
开源项目的贡献者越来越多,Linux
迫于压力,选择一个版本控制系统,但是并不是集中式版本控制系统中鼎鼎有名的SVN
,而是选择了一个商业的版本控制系统,这个系统并不是集中式的,而是分布式的版本控制系统。他们用这个系统用了3年左右的时间。这又是为什么呢?因为Linux
项目贡献者实力太强了。
2005年,Linux
项目中一个大牛打算对他们使用的商业版本控制系统进行反编译,开发一个类似的系统出来,但这个事被这个商业系统的开发公司知道了,要求收回对Linux
社区的免费授权。所以,Linux
社区选择了开发一个分布式版本控制系统工具,并在开发过程中汲取之前使用版本控制系统的经验教训,这才有了现有最流行的Git
。自从2005年Git
诞生以来,众多的开源项目都从SVN
或其他版本控制系统迁移到Git
。
Git
虽然是在Linux
系统中开发的,但是可以在所有主流的操作上部署,包括Linux
、Windows
和Mac OS X
等。
3 Git基础
3.1 Git工作区、暂存区和版本库
Git
中的工作区、暂存区和版本库的相关概念如下:
- 工作区:在电脑中能够看到的文件夹目录,对应着项目某个版本的检出
- 暂存区:通常是指
.git
目录下的一个index
文件,所以也把暂存区称为索引,它存储着下次要提交时的相关信息 - 版本库:本地的版本库一般是指工作区的
.git
目录,保存项目的元数据和对象数据库,是Git
中最重要的部分
一个文件在这3个区域对应的状态分为:已修改、已暂存和已提交。已修改表示在工作区修改了文件,已暂存表示将修改后的文件做了标识并加入到暂存区,已提交表示修改的文件以完全地存入本地数据中。
3.2 快照,而非差异
这里的快照可不是“快速的出照片”的意思,而是应该理解为:记录某个系统或应用在某个时刻的状态。Git
使用快照来管理数据。
Git
之外的大部分版本控制系统以文件列表的方式存储信息,并将这些信息看做为一组文件并记录这些文件随着时间所做出的变更。
Git
将数据看做为系统的一组快照,每次提交变更时,会抓取一张所有文件当前状态的快照,并更新执行最新快照的引用。每个快照均包含了完整的数据。在生成新的快照之前,Git
会读取工作空间的所有数据,进行预存,然后在做处理,处理过程大概是:先和上一次的快照做对比,对于没有更改的文件数据,会从预存数据中冗余文件的数据中删除,改为保留指向上一版本中指向该部分的指针,而对于已修改的文件数据会保留下来,通过这个处理过程,可以大大的提高效率。
3.3 所有操作在本地执行
与集中式版本控制系统不同,Git
的绝大部分操作都是在开发者个人电脑上完成的,一般无需从网络中其他的计算机中获取信息,使用速度不是一般的快。
3.4 Git完整性
Git
的所有数据在存储前都会进行校验和计算,然后在用校验和来引用对应的数据,这个规则是及其重要的。因为,基于这个规则,不可能在Git
不知情的情况下更改文件或目录的内容,从而使得Git
能够在数据传输过程中检测出丢失的信息或者受损的文件。
Git
使用的校验和机制叫做SHA-1
散列,最后得到一个40个十六进制的字符串,这个值是根据文件内容或者Git
目录结构计算得来的。Git
并不是通过文件名在对象存储库中存储消息的,而是通过信息的散列值。
3.5 Git没有引入辅助目录
很多版本控制系统中,比如CVS
和SVN
,都会在工作区每个目录下创建相应的目录或文件,这些目录如果在暴露在服务器上会非常危险,因为这会暴露出目录下的文件列表,让服务器配置的禁止目录浏览失效。另外,在SVN
中,每个目录下的.svn
辅助目录中还会存在文件的原始拷贝,从而增加文件搜索的时长。而Git
没有这个问题。Git
不会在工作区的每个目录下创建辅助目录或文件,除了在工作区根目录下的创建的.git
(本地版本库)。
4 Git的安装方法
4.1 Linux下安装Git
Linux
系统安装Git
有2种方式:一种通过Linux
包管理器安装编译好的Git
软件包,另一种方法是下载Git
源代码并在此基础上进行编译安装。
4.1.1 通过Linux包管理器安装Git
通过Linux
包管理器安装Git
是最简单的一种方式,并且会自动配置好命令自动填充等功能,但是有一个缺点,这种方式安装的Git
可能不是最新的。
在一些Linux
老系统中,这种安装方式需要注意的一点。在这些老的Linux
系统中,Git
安装包名称不是git
而是git-core
,因为GNU
交互工具提前占用了git
这个名字。但是,新版本的Linux
系统中,GNU
交互工具让出这个名字,可以使用git
这个包名字安装Git
。但是,平常大家使用的Linux
系统,像Centos 7.6
、Ubuntu 18.06
和Ubuntu 20.04
,可以不用考虑这个问题。
- 在
Ubuntu 10.10
及以后的版本、Debian(squeeze)
及更高的版本:
sudo apt install git-all
这条命令将安装必须的git
安装包以及其他可选的安装包,比如:git-doc
包含了Git
的HTML
文档,安装后可通过git help -w <sub-command>
在浏览器中打开相关子命令的HTML
帮助。
- 在
Ubuntu 10.04
及以前的版本、Debian(lenny)
及以前的版本:
sudo apt install git-core
sudo apt install git-doc git-svn git-emial git-gui gitk
其中,git-core
是必需的安装包,其他是可选项。
- 在
RHEL
、Fedora
和CentOS
中:
yum install git
yum install git-svn git-doc git-mail git-gui gitk
Git
在这些系统中的发行的软件包都叫git
4.1.2 从Git源代码中安装
访问Git官方网站,下载Git
源代码,例如:git-2.30.0.tar.gz,安装过程如下:
- 解压源代码包,并进入到对应的目录中
tar -xzvf git-2.30.0.tar.gz
cd git-2.30.0.tar.gz
- 参照解压后的
INSTALL
文件安装
make prefix=/usr/local all
sudo make prefix=/usr/local install
/usr/local
这是Git
的安装目录,可以对应的修改。安装后,可以在对应的安装目录下找到git
命令
- 参照其他资料安装可选软件,比如:
git-doc
4.2 Windows下安装Git
Windows
下安装Git
有多种办法,这里介绍如下两种:
- 在Git官方网站上下载安装包
Git for Windows
,需要注意的是,这个项目是独立于Git
的 - 安装
Windows
版本的GitHub
软件,安装后,会自动提供命令行版本的Git
,也包括GUI
4.3 Mac下安装Git
Mac
下安装Git
也有多种方法,这里也是介绍2种方法:
- 对于
Mavericks
10.9及其更高的版本,当第一次在终端执行git
命令时,系统会自动判断是否已安装Git
如果没有将会自动安装 - 在Git官方网站上下载二进制安装程序进行安装
5 Git的初始化
通过上面的章节内容,相信你已经了解什么是Git
并且在你的电脑上安装了Git
。在正式使用之前,需要对Git
做一些相对应的配置,这些配置只需配置一次就行。
Git
提供了git config
的工具,用来获取和设置配置变量,这些设置会存在:
- 系统文件(例如:
/etc/gitconfig
),此文件包含了系统所有用户及其仓库的值,可通过git config --system
选项设置系统的配置变量 - 全局文件(用户主目录下的
.gitconfig
文件),此文件包括了当前系统用户设置的配置变量,可通过git config --global
选项设置全局的配置变量 - 仓库主目录文件(
.git/config
文件),此文件针对单个仓库
其中,版本库中的配置文件优先级最高,其次是全局的配置文件,最后才是系统及配置文件,也就说,如果三个文件中都用同样的配置,会使用版本库的中配置。
5.1 配置用户名及邮箱
可通过以下命令配置用户名及邮箱:
git config [--system][--global] user.name <your_user_name>
git config [--system][--global] user.emial <your_emial>
通过上述命令可告诉Git
当前用户的姓名和邮件地址,当在提交信息时,会用到这些信息。其中,如果使用--system
选项,需要拥有管理员权限
5.2 配置Git编辑器和颜色
可通过以下命令(以emacs
为例)配置Git
命令调用的编辑器,如果没有编辑器,将会使用系统默认的编辑器,比如vim
git config [--system][--global] core.editor emacs
或者在Windows
系统中(以Notepad++
为例):
git config [--system][--global] <notepad++.exe的路径> -multiInst
使用以下命令可开启颜色显示:
git config [--system][--global] color.ui true
5.3 查看个人设置
可使用命令git config --list
查看当前Git
可以找到的所有配置。
6 查看Git帮助
可使用命令git help <verb>
、git <verb> help
或者man git <verb>
查看指定命令的帮助信息