git官方文档👈有问题建议先看文档,二手资料有时会存在奇奇怪怪的问题。
emmm,其实是想写一篇使用hexo
快速搭建个人博客的教程,但感觉在那篇教程里穿插着讲git
的话,很多初学者可能搞不清楚git
到底是什么,甚至可能会把git
和hexo
的概念绑定起来,那样就比较麻烦了。所以就决定先写一篇文章介绍git
(去年学得时候没写,正好也是补充一下)。
git相关概念
到底什么是git
呢?用一句话来说,git
是一种分布式版本控制系统。暂时看不懂也没关系,接下来会详细说所谓的“分布式版本控制系统”是什么。
版本控制系统
先说说版本控制系统是个啥。
为了方便理解,在这里举一个常见的案例来进行解释:
1 | 你需要和舍友共同完成一篇3000字的论文,你写A部分,舍友写B部分。 |
这种时候,就到我们的主角出场的时候了,它就是今天的主角:
在线共享文档 版本控制系统!
版本控制系统(Version Control System,VCS)就可以完成上述的工作,它可以自动跟踪文件的变化、还原文件的历史记录、协调多人在同一个项目中工作,宾且可以在必要情况下回溯到过去的任意版本。
在软件开发中,版本控制系统可以帮助开发人员有效地管理和维护代码库,支持项目的分支、合并等操作。这样,在多人协作开发的情况下,不同的成员可以同时对同一个项目进行开发,而不会产生代码冲突等问题。此外,版本控制系统还可以提供更好的安全备份和恢复机制,以防止意外的数据丢失或代码损坏!
常见的版本控制系统有Subversion
、Mercurial
,当然,还有我们的主角——git
!
分布式 & 集中式
再说说什么是分布式,以及与分布式对应的集中式。
在版本控制系统中,分布式是指每个开发者都有完整的代码库副本,并且可以在本地进行修改、提交和推送等操作。
相比之下,集中式版本控制系统(例如SVN
)依赖于一个中央代码库。开发者从中央代码库检出代码副本,然后在本地进行修改,修改后,他们必须将更改推送回中央代码库,否则其他开发者无法获得最新版本的代码。
二者的区别在于,在分布式系统中,每个开发者都有完整的代码库副本,可以在本地进行修改、提交和推送等操作;而在集中式系统中,开发者只能从中央代码库检出代码,并且必须将更改推送回中央代码库。这就意味着,在分布式系统中,开发者可以在没有网络连接的情况下继续工作,不需要频繁地与中央服务器进行通信,同时,每个开发者都能拥有完整的历史记录,方便历史回溯等操作。
git安装配置
阿菇的系统是Fedora 37
,如有差异请自行解决。在终端执行以下命令安装git
。
1 | # Fedora用户使用这句 |
配置
我们可以通过修改git
配置来定制git
环境。首先需要设置用户名和邮箱地址,我们之后的每一次git
提交都会包含这些信息。使用以下指令全局设置username
和email
:
1 | # 将"your-username"和"your-email-address"替换为你的用户名和邮箱地址 |
你还可以使用以下指令检查你的git
配置信息:
1 | git config --list |
使用以下指令查看当前系统所有的git
配置文件及其位置:
1 | git config --list --show-origin |
进一步的配置,如设置默认的文本编辑器、搭建git服务器等,可以参考官方文档,这里不过多介绍。
本地创建git仓库
仓库,可以简单的理解成一个目录,这个目录里的文件和资源都可以通过git进行管理。
使用以下指令初始化一个本地的git仓库。
1 | # 将 your-repo-name 替换为你的git仓库的名称 |
使用这句指令后,会有输出提醒,你新建了一个空的Git仓库。转进到这个目录,你会发现这个目录下其实已经包括了一个隐藏目录.git
,这里面存储的是一些版本信息,用于跟踪管理文件信息,平常不去碰它就好了。
git分区
此部分讲解git
的三个工作分区是怎么工作的,也就是git
到底是如何对我们的项目进行版本控制的。
三个分区
一个完整的本地git
工作目录包括三个分区,工作区、暂存区和版本库。
- 工作区:指的是当前目录下除
.git
目录外的区域,用户可以随意修改工作区文件的内容。 - 暂存区:指的是
.git
目录下的index
文件,该文件包含了当前工作树中所有被添加到版本控制中的文件列表和它们的元数据,如文件名、文件类型、文件大小、最后修改时间等信息。 - 版本库:指的是存储代码版本历史记录的地方,也就是代码仓库。git的版本库包含了所有commit的snapshot和message,以及所有branch、tag等元数据信息。通常情况下,一个项目只有一个版本库,它可以存储在本地或者远程服务器上,开发者可以通过命令行或者图形界面工具来管理和操作版本库。
以上三个分区中,暂存区和版本库可以合称为git仓库。
看到这里,你可能会有些疑惑,我们刚才使用init
指令不是创建了一个git仓库吗,为什么这里又说暂存区和版本库可以合称git仓库,工作区去哪里了?
我们刚才使用git init
指令,本质上是创建了一个空的项目目录,这个项目目录下自动包含了一个.git
目录(也就是git
仓库),方便我们对这个项目目录进行版本管理,刚才所说的暂存区和版本库,实际上都位于.git
隐藏目录下。出于习惯,我们一般会把整个项目目录叫做一个git仓库
,也可以叫做本地仓库,与接下来会讲到的远程仓库相对应。
在分区之间操纵文件
这张图可以清晰的看到三个分区之间的关系,以及我们应该如何使用git
来操作我们的文件。
在具体讲解如何在不同分区之间操纵文件之前,先说一下如何查看某个文件的状态。我们可以使用以下指令查看当前git目录中某个文件的具体状态:
1 | git status |
在这个指令的输出中,一个文件存在以下三种状态:
- 不显示:表明该文件没有发生改动,改动是指该文件在工作区和在版本库中的内容不同,新建、删除文件均属于改动;
- 红色文件:表示文件已发生改动,且没有添加到暂存区中;
- 绿色文件:表明文件已发生改动,且已经添加到暂存区中。
具体的指令就不细说了,直接在底下罗列出来,需要时拿过来用就行,很容易就能看懂。
1 | # 工作区 -> 暂存区 |