0.前言
- 您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章。本系列主要深入讲解有关Git的基础知识和基础使用,在文章中会结合部分Git网站上推荐的电子书《Pro Git》来对Git进行解读,意在补充书中对您“不友好”的部分,让它变得更加清晰、适合新手。
- 本次博文主要讲解“版本控制系统”、“Git的基础认知”、“Git的三种状态/三种工作区(重要)”、“Git的下载”、“Git的学习路径”、“Git的Bush界面”、“学Git之前的基础技能”、“Git的三个配置文件(重要)”、“如何在Git的学习中获取帮助”等
1.有关Git知识这一部分
仅作了解即可
1.1.关于版本控制及其分类
- 版本控制系统即:version control system,简称“VCS”。其中“Version”有“型号、版本的意思”,“control”为“控制”,“system”为“系统”
- 版本控制是一种“记录一个或若干文件内容变化,以便将来查阅特定版本修订情况”的系统。 有了版本控制系统,只要我们将文件交给其处理,就可以:
- 回到这份文件(或者整个项目)在某一个版本的状态
- 也可以比较这些文件在不同版本的变化细节,查看项目出错的原因
- 利用版本控制,可以在多人合作中提高效率
- 尽管更多把软件源代码的文件作版本控制,但实际上,可以对任何类型的文件进行版本控制。
总之,版本控制系统是一剂“后悔药”,也是多人合作的“合体技”。
1.1.1.最简单的“版本控制”
直接复制整个项目目录来保存不同的版本,然后加上备份时间以示区别。
- 优点是容易想到、简单且易操作
- 缺点是容易犯错、会混淆所在的工作目录(导致写错文件或者覆盖了意想之外的文件)
1.1.2.本地版本控制系统
- 为了解决上面的问题,很久以前就有许多种本地版本控制系统,而这些版本控制系统大多采用某种简单的数据库来记录文件的历次更新差异。
- 最流行的本地版本控制系统叫做RCS。RCS的工作原理是在硬盘上保存补丁集(这里的“补丁”是指文件修订前后的变化)。通过应用/叠加所有的补丁,可以重新计算出各个版本的文件内容,借此恢复到某个历史状态。
- 在很多计算机还有一些RCS部署
1.1.3.集中化版本控制系统
- 上面的本地版本控制系统解决了个人在保存不同版本的问题,但是还没有办法多人协作,因此诞生了集中化版本控制系统。
- 多个客户端可以向同一个服务器(这个服务器包含了文件的所有修订版本)检出文件
- 这种版本控制系统的优点是:每一个人都可以一定程度上了解其他人都在项目中做了什么、服务器的管理员可以精准控制每一个人的权限、维护单一的服务器要比维护每一个客户端的本地数据库要来得简单
- 但是最大的缺点是:如果这个服务器出现问题了,有可能整个项目的所有记录都没有了
1.1.4.分布式版本控制系统
而分布式版本控制系统则同时解决了上面的出现两个问题
- 对于每一个分布式版本控制系统来说,客户端检出的文件不仅仅是检出文件的最新状态,而是对整个代码仓库进行一种完整的复制(即一次完整的镜像)。这样任何一个客户端只要曾经镜像过一次代码仓库,哪怕服务器出现问题导致代码仓库遗失,也可以使用客户端的本地镜像来恢复服务器代码仓库
- 而Git就是其中一款知名的分布式版本控制系统
1.2.Git的历史
这一段历史确实值得一看,您可以看看官网的介绍,这里截取部分供您观看
Linux 内核开源项目有着为数众多的参与者。绝大多数的Linux内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到2002年,整个项目组开始启用一个专有的分布式版本控制系统BitKeeper来管理和维护代码。到了2005年,开发BitKeeper的商业公司同Linux内核开源社区的合作关系结束,他们收回了Linux内核社区免费使用BitKeeper的权力。这就迫使Linux开源社区(特别是Linux的缔造者LinusTorvalds)基于使用BitKeeper时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:
1.速度
2.简单的设计
3.对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
4.完全分布式
5.有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
——摘取自官网的在线电子书1.2节
实际上关于Git和BitKeeper,还有一段令人嘘唏的故事,您可以去了解一下
1.3.Git的基础
1.3.1.Git是记录快照,而非差异比较
Git和其他的版本控制系统有很大的不同
- 其他的版本控制系统将他们存储的信息看作是:“一组基本文件”+“每个文件随时间积累的差异”
- Git对待数据不是针对差异,在Git中会把存储的信息看作是:“对小型文件系统的一系列快照”或者说“快照流”,每次提交更新或者保存项目状态的时候,Git会把当时的所有文件创建一个快照,并且保存一份这个快照的索引。
- 因此,为了效率,如果没有文件发生变动,Git就不再重新存储该文件,而是只保留一个链接指向之前存储的文件
1.3.2.Git近乎所有操作都是本地执行
Git几乎所有操作都是在本地执行的,只需要调动本地文件和资源,一般无需从网络中获取其他计算机的信息和资源(当然clone等需要从网络获取信息和资源的指令除外)。
- 因此Git的历史记录直接存储在本地磁盘中,这会赋予Git极快的速度(例如查找比较远久的历史记录)
- 在无网络和断掉VPN的状态下,Git也能执行大部分指令
1.3.3.Git保证完整性
- 校验和
Git 中所有的数据在存储前都会计算“校验和”,然后以“校验和”来引用。
1.这意味着不可能在Git不知情时更改任何文件内容或目录内容。
2.这个功能建构在Git底层,是构成Git哲学不可或缺的部分
3.若你在传送过程中丢失信息或损坏文件,Git就能发现。
——摘取自官网的在线电子书1.3节
在计算机中“校验和”是一种用于检查数据是否完整、未损坏、未被篡改的方法。可以将校验和看作是一个“数字签名”,它是通过对数据进行特定方式的数学计算,生成了一串长度固定的数字。如果数据在传输或存储过程中发生了变化,那么计算后得到的数字就会与原来的数字不同,从而可以判断数据的完整性。
- SHA-1散列
Git用以计算“校验和”的机制叫做“SHA-1散列(hash,哈希)”。 这是一个由40个十六进制字符(0-9 和a-f)组成的字符串,基于Git中文件的“内容”或“目录结构”来计算出来。 SHA-1哈希看起来是这样:24b9da6552252987aa493b52f8696cd6d3b00373
——摘取自官网的在线电子书1.3节
其中由这种“SHA-1散列”计算出来的值又叫做“SHA-1值”。实际上,Git数据库中保存的信息都是靠文件内容的“SHA-1”来索引,而不是依靠文件名。文件名对“SHA-1值”的计算毫无影响。
1.3.4.Git一般只添加数据
一旦你提交快照到Git中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。
——摘取自官网的在线电子书1.3节
所有Git执行的指令,大部分都只能往Git内“添加”数据,这个“添加”的理解不仅仅是“添加新的数据”,更有可能是添加“删除的状态”等情况,也许这很难理解,但是在经过对Git相关指令的学习你就会明白了。
1.3.5.Git的三种状态和三个工作区
- 在Git中有三种状态需要你提前了解,你的文件就有可能处于以下三种状态中
- 已提交(committed)
- 已修改(modified)
- 已暂存(staged)
- 因为这三个状态,也引出了三个工作区(可以理解为三个工作空间)
- 工作区/索引(Working Directory)
- 暂存区(Staging Area)
- Git目录/存储库(.git directory/repository)
工作区是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。 Git仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。这是 Git中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
——摘取自官网的在线电子书1.3节
- 将三个状态和三个工作区结合起来/在Git中基本的工作流程
- 在“工作区”中修改检出或新加的文件(此时文件处于“已修改”的状态)
- 将你想要提交的更改选择性地暂存,这样只会将更改的部分添加到“暂存区”(此时文件处于“已暂存”的状态)
- 提交更新,找到“暂存区”的文件,将快照永久性存储到“Git目录/存储库”中(此时文件处于“已提交”的状态)
2.Git安装以及下载检查
2.1.下载Git
下载Git并不难,您可以根据您的环境去官方网站找到合适的Git版本直接下载安装(当然,也不是不可以从源码处获取最新版本的Git,这样你会得到最新版本的Git,但是这种安装方式对新手,特别是编程新手并不友好,比较劝退。如果您是老手,请点击这里)
2.2.下载成功后可以检查一下自己的git是否下载成功
$ which git #会出现git的安装路径 $ git --version #会出现git的版本
另外,本文章的所有演示和操作均处在“git version 2.33.1.windows.1”版本下的Bash界面中。
3.Git的学习路径
3.1.对于初入门的新手
这份基础pdf可以研究一下、还有这本基础书《Git从入门到精通》,不过这本书前面写得还好,后面看起来有一点点迷糊起来了,对初学者来说还是需要Google一下才能明白
3.2.也可以选择在官网看
官网有文档、在线电子书、视频来辅助学习,这也是不错的路径
4.进入Bash/GUI界面
首先在想要使用Git托管的文件夹底下右键鼠标,就会出现两个选项:“Git GUI Here”和“Git Bash Here”
- Git下载后就可以使用命令行来和Git进行交互,而“Git Bash”界面其实就是模拟Linux的知名软件——“Bash”来进行命令行交互的
- 另外一个选项是Git自带的图形化界面工具,实际上在git官方网站上是有GUI(图形界面)的其他工具的,可以下载一个(比如SourceTree)来玩玩,但是对于Git初学者来说,最主要的还是先从指令来学习。这些图形界面只是方便了解了指令的Git工作者,不见得对初学者有多大的方便之处。
官网中也有提到一个观点:“只有在命令行模式下你才能执行Git的所有命令,而大多数的GUI软件只实现了Git所有功能的一个子集以降低操作难度。如果你学会了在命令行下如何操作,那么你在操作GUI软件时应该也不会遇到什么困难,但是,反之则不成立。此外,由于每个人的想法与侧重点不同,不同的人常常会安装不同的GUI软件,但所有人一定会有命令行工具。”
——摘取自官网的在线电子书1.4节
- 在学习完所有的Git指令后,你也可以尝试去使用“lazygit”这款在终端里运行的Git工具
5.基础技能一:一些Liux的常用基础命令
虽然在“Git Bash”内使用Git的时候会使用一些基础的Linux指令,但是基本用到的指令都很简单(当然如果您会那真的是太好了,这些指令将对您没有丝毫阻碍),您只需先好好记下下面的几个指令就可以。尤其需要注意的是:请先打开英文输入法!!!
$ cd #切换目录(打开目录)
$ pwd #查看当前所在的文件目录
$ ls #列出当前目录所有文件/文件夹,并且给出文件/文件夹的一些基本信息
$ mkdir #创建新的目录
$ touch #创建新的文件
$ cp #复制文件
$ mv #移动文件
$ rm #删除文件
$ clear #清除当前屏幕内容,有的时候界面上的内容太多了,可以使用这个指令清理一下
6.基础技能二:Vim基础使用
6.1.为何使用vim
vim是git的默认文编辑器(类似与windows中记事本一样的存在,只不过功能比windows自带记事本要强大得多),您可以自己换其他编译器(例如换成VScode),不过对于新手来说暂时不推荐。这是因为作为一名程序员对于vim的熟练使用是一种自我修养,况且我希望在后面保持原滋原味的Git环境,等您熟悉Git的世界后再了解其他的自定义设置也不迟。
6.2.vim的常用模式
vim是在多种模式下处理文本的工具,您可以在不同的模式下输入指令来编辑您的文本,成功下载好Git后,打开Bash界面后,可以使用以下命令来打开vim界面
$ vim text.txt
#创建text.txt文件,并且使用vim编辑,这个时候就会进入vim界面
#注意!打开后先不要动你的键盘
这个时候vim默认进入“命令行模式(Normal模式)”
6.2.1.插入模式(Insert模式)
- 如果在命令行模式下,键盘输入“i”后就会进入插入模式,这个时候敲击键盘可以把文本插入到文档中
- 如果在命令行模式下,键盘键入“a”后就会进入插入模式,这个时候如果文本本身有内容,就将光标挪到文本末尾,进行追加输入
- 如果在命令行模式下,键盘键入“o”后就会新建一行来进行文本输入
6.2.2.命令行模式(Normal模式)
- 如果在插入模式下,使用命令“esc”就可以回到命令行模式
- 回到命令行模式后,使用“w”表示存档,vim会对当前文本进行保存
- 回到命令行模式后,键盘键入“q”就会离开vim界面,如果还有没有存档的文本,vim会给出提醒(若是不需要存档,可以在q前面加上“!”变成“!q”,表示强制退出)
- 回到命令行模式后,“wq”是上面两个指令的融合,vim会将当前文档保存后离开vim界面
7.Git的配置文件
7.1.config工具
Git自带一个“git config”的工具来控制Git的外观和行为的配置变量,每一台计算机只要配置一次,哪怕下次软件更新也会保留这些配置信息。
7.2.修改三个位置的配置文件
这些配置变量存储在三个不同的位置,但是它们的作用范围不同
7.2.1.配置系统级别:“/etc/gitconfig文件”
这是Git系统级别的配置文件,包含系统上每一个用户及他们仓库的通用配置。如果你在执行“git config”命令时带上了“–system”选项,Git就会读写该文件中的配置变量。而因为它是系统级别的配置文件,所以需要管理员或超级用户的权限才能修改它。
# 使用例子
$ sudo git config --system user.name "Your Name"
$ sudo git config --system user.email "youremail@example.com
7.2.2.配置用户级别:“/.gitconfig或/.config/git/config文件”
这是针对当前用户的配置文件。你可以传递“–global”选项让Git读写此文件,这样会对你系统上所有的仓库生效
# 使用例子
$ git config --global user.name "Your Name"
7.2.3.配置仓库级别:“.git/config文件”
这是针对当前仓库的配置文件。默认情况下,Git 会用它,它只对当前用户拥有仓库有效。你可以传递“–local”选项让Git强制读写此文件,虽然默认情况下用的就是它(当然,你需要进入某个Git仓库中才能让该选项生效)
$ git config --local user.name "Your Name"
$ git config --local user.email "youremail@example.com"
7.3.查看三个位置的配置文件
7.3.1.查看系统级别:“/etc/gitconfig”文件内容
$ git config --system --list #这个命令会列出系统级别Git配置文件(通常是“/etc/gitconfig”)中的所有配置变量和值
当然你也可以选择去电脑文件夹内查看,以下是windows环境下默认的存放位置
7.3.2.查看用户级别:“$HOME/.gitconfig”文件内容
$ git config --global--list #这个命令会列出全局Git配置文件(“$HOME/.gitconfig”或“$XDG_CONFIG_HOME/git/config”)中的所有配置变量和值
同样的,你也可以选择查看您电脑用户下的配置文件,如果您再windows有多个账户,可能就会有多份这样的文件(如果您看不到“.gitconfig”这样的文件,则需要勾选“查看隐藏选项”)
7.3.3.查看仓库级别:“.git/config”文件内容
$ git config --local --list #这个命令会列出当前仓库中所有的配置变量和值
如果您经过后面的命令成功创建了一个由Git管理的库,可以在这个库里“.git”里查看您当下这个仓库的配置(如果您看不到“.git”这样的文件夹,则需要勾选“查看隐藏选项”)
7.3.4.查看单独的某个配置
需要注意的是,如果你想查看某个特定的配置变量的值,可以在以上命令的后面添加变量名。
$ git config user.name #这个命令会输出当前设置的用户名(默认最小范围)
#如果变量的前面加上“--local”、“--global”、“--system”选项,则会分别查找对应的配置文件中的该变量的值
7.3.5.查看所有配置
$ git config --list #这个命令可以查看当前Git的所有配置信息
$ git config --show-orgin --list #这个命令会比上面的命令更加详细,会给出所有配置的同时,给出这些配置的所在的位置
7.4.在文件中修改和查看配置
上面介绍的三种配置,本质其实也是文件,所以也可以通过编辑这些文件来修改Git的相关配置信息。但需要谨慎操作,避免产生不可预知的后果。如果您不确定如何编辑这些文件,请尽可能使用“git config”这个命令来进行配置。
7.5.下载Git后的基础配置
下面来根据前面的内容来配置您的Git中的一些基础配置
7.5.1.设置用户身份
这一步非常重要,因为Git的每一步提交都需要用到这些信息,而且还会被写入到所创建的提交中,不可更改。
$ git config --global user.name "yourname"
$ git config --global user.email "youremail"
# 当然,如果你想在在这个项目中使用不同的用户名和用户邮箱,也可以换成“--local”选项,只为当前这个仓库设置用户名和用户邮箱(当然你也可以直接什么选项都不带,直接写成“git config user.name "…"”或者“git config user.email "…"”。即:直接去掉“--global”选项和加上“--local”选项的行为在本命令中是一样,只不过对于新手来说,把参数写全更加容易理解而已)
7.5.2.设置个人编辑器
这里我推荐不配置,使用Git自带的Vim编辑器即可,当然如果您觉得使用Vim的过程实在太过于繁琐,您也可以尝试改一下这个配置(但是注意,为了本文的普遍性,后续的文本编辑过程都会采用Vim,如果您使用了其他编辑器,其操作部分应由您妥善负责)
$ git config --global core.editor "写下你要的编辑器的安装路径"
7.5.3.检查个人设置
$ git config --show-orgin --list
#这个命令可以列出当前Git可以找到的所有配置变量和所处文件,当然您也可以根据我们上面讲解的三个配置文件的内容来一一查看配置信息
8.获取帮助
8.1.离线获取帮助
- help指令
直接使用
$ git help <某些不理解的命令> #输入后就会打开一个html文档,里面是对相关指令的解读
当然您也可以写成下面这种形式,也同样会打开帮助文档
$ git <某些不理解的指令> --help
这个命令还有个简化版,可以直接在Bash的界面内输出帮助信息
$ git <某些不理解的命令> -h
- man指令
另外也可以使用man指令(但是注意,在windows环境下并不支持,因为这是Linux下的一个指令,除非您在windows下有设置Linux的相关配置,因此这条指令只能在Linux环境或Linux的虚拟机等环境下使用)
$ man git <某些不理解的指令>
8.2.在线获取帮助
- 在官网查询或者Google一下
在学习的过程中你不能太懒,“Google一下是可以的”
- 在Freenode IRC服务器上的#git或#github 频道寻求帮助
如果你觉得手册或者本书的内容还不够用,你可以尝试在 Freenode IRC 服务器 https://freenode.net 上的#git 或 #github 频道寻求帮助。 这些频道经常有上百人在线,他们都精通 Git 并且乐于助人。
——摘取自官网的在线电子书1.7节
9.总结
恭喜您,成功踏入Git的学习门槛,下面我们来总结一下我们今天所学
- 您已经知道了什么是版本控制系统,并且明白Git是其中的一种
- 您已经有了对Git的一些基础认知,知道它是怎么来的,也明白了Git的工作模式和特点(包括Git的三种状态/三种工作区等)
- 相信您已经成功下载了Git(没有下载好也不必气馁,有必要的活,我也可以给您出一篇博文来讲解,当然我更加建议您Google一下,这样的文章有很多)
- 我和您阐述了有关Git的学习路径,让您明白下一步要学什么(当然,如果仍旧糊涂,不妨在我的Git栏目里继续看下去)
- 您知道Git的Bush界面长什么样子了吧?
- 认识了一些在学Git之前的基础技能,认识了一些基本的Linux的基本指令和Vim操作
- 我还和您详细解释了Git的三个配置文件的位置及其它们的作用范围
- 最后我们还探讨了如何在Git的学习中获取帮助
最后,愿与君共勉。